Linux之rsyslog(2)输入输出配置
Linux之rsyslog(2)输入输出配置
Author:Once Day Date:2025年10月30日
全系列文章请查看专栏: Linux Shell基础_Once_day的博客-CSDN博客。
漫漫长路,有人对你微笑过嘛…
参考文档:
- Beginner Tutorials - rsyslog 8.2510.0 documentation
 
文章目录
- Linux之rsyslog(2)输入输出配置
 - 1. 基本架构
 - 1.1 日志消息流
 - 1.2 处理规则
 - 1.3 配置文件
 - 1.4 支持的配置格式
 
- 2. rsyslog输出模块
 - 3. rsyslog输入模块
 - 4. rsyslog解析模块
 - 4.1 pmrfc3164: RFC3164格式消息解析器
 - 4.2 pmrfc5424: RFC5424格式消息解析器
 - 4.3 pmrfc3164sd: 解析RFC3164消息中的RFC5424结构化数据
 - 4.4 pmciscoios: Cisco IOS设备日志解析器
 - 4.5 pmdb2diag: IBM DB2诊断文件解析器
 - 4.6 pmlastmsg: "最后一条消息重复n次"处理器
 - 4.7 pmnormalize: 日志消息标准化解析器
 - 4.8 pmnull: Null解析器模块
 
- 5. 消息修改模块
 
1. 基本架构
理解 rsyslog 的最佳方式是将其视为一个高度可扩展的日志与事件处理框架。虽然日志消息的总体流转流程固定,但通过配置 rsyslog 对象,几乎可以自定义其处理流水线的所有环节。
1.1 日志消息流

从宏观层面看,rsyslog 处理消息分为三个主要阶段:
- 输入(Inputs):通过输入模块接收消息。例如,通过
imuxsock模块接收系统日志,或通过imtcp模块接收基于 TCP 的日志。 - 规则集(Rulesets):每条消息会经过一个或多个规则集。一个规则集包含一系列规则,每条规则都配有过滤器和关联的操作。
 - 操作(Actions,即输出):当某条规则匹配时,会执行其关联的操作。操作决定消息的处理方式,包括写入文件、转发至远程服务器、插入数据库,或进行其他处理。
 
1.2 处理规则
理解 rsyslog 处理模型的关键规则:
-  
作为入口点的规则集:输入模块将消息提交给规则集。若未明确绑定规则集,则使用默认规则集(
RSYSLOG_DefaultRuleset)。也可定义额外的自定义规则集。 -  
规则集中的规则:一个规则集包含零条或多条规则(不过零规则没有实际意义)。规则在规则集中按从上到下的顺序依次执行评估。
 -  
过滤器与操作列表:一条规则由过滤器(评估结果为真 / 假)和操作列表组成。当过滤器匹配时,执行操作列表;若过滤器不匹配,rsyslog 会继续处理下一条规则。
 -  
完整评估:所有规则都会被评估,除非通过
stop命令明确终止消息处理。stop会立即中止对该消息的处理流程。 -  
操作列表:一个操作列表可包含一个或多个操作,操作按顺序串行执行。同一列表中的操作不包含过滤器(过滤器仅作用于规则级别)。
 
1.3 配置文件
默认情况下,rsyslog 会从/etc/rsyslog.conf加载配置。该文件可能会包含其他配置片段(通常位于/etc/rsyslog.d/目录下)。
若需指定其他配置文件,可使用以下命令:
rsyslogd -f /path/to/your-config.conf
 
1.4 支持的配置格式
rsyslog 在历史上支持三种配置语法:
-  
RainerScript(现代风格)—— 推荐使用且持续维护,这是当前完全受支持的配置格式。语法简洁、结构化,最适合创建新配置或复杂配置场景。
 -  
sysklogd 风格(旧式语法)—— 新配置中已弃用,该格式使用广泛且仍可正常运行,但对新用户而言较难理解。仅推荐熟悉它的资深管理员使用,或用于维护旧配置。示例如下:
mail.info /var/log/mail.log mail.err @server.example.net -  
旧式 rsyslog 风格(美元符号前缀)—— 已弃用,这种格式的指令以
$开头(例如$ActionFileDefaultTemplate),为保证向后兼容仍完全支持,但不建议用于任何新配置。 
为何优先选择 RainerScript?
RainerScript 更易阅读和维护,能避免包含文件带来的副作用,还支持结构化过滤器、模板、复杂控制流等现代功能。
对于新配置,应始终使用 RainerScript。旧式格式仅为兼容旧部署和发行版而保留。
以下是 RainerScript 规则示例:
if $syslogfacility-text == 'mail' and $syslogseverity-text == 'err' then {action(type="omfile" file="/var/log/mail-errors.log")
}
 
rsyslog 支持两种注释方式:
- # 注释:以
#开头,注释内容延伸至行尾。 - C 风格注释:以
/*开头、*/结尾。可跨多行,但不支持嵌套。 
RainerScript 支持控制结构(如 if/else 等)。
过滤器(例如prifilt())可用于对消息进行条件匹配。
可使用set、unset和reset语句修改数据。
每个输入(Inputs)都需要专用的输入模块。
加载模块后,使用input()对象定义输入。
module(load="imtcp")                   # 加载TCP输入模块
input(type="imtcp" port="514")         # 监听TCP 514端口
 
输出(Outputs,即动作),动作负责输出操作,例如写入文件、数据库或转发到其他系统。
使用action()对象配置动作。
action(type="omfile" file="/var/log/messages")   # 写入本地文件
 
规则集与规则,规则集类似于消息处理的 “程序”。一个规则集可绑定到特定输入,也可作为默认规则集使用。
ruleset(name="fileLogging") {if prifilt("*.info") then {action(type="omfile" file="/var/log/info.log")}
}
 

2. rsyslog输出模块
基础传输模块:
- omfile: 文件输出模块,将日志写入本地文件系统,适用于大多数基本日志存储场景。
 - omfwd: 标准syslog转发模块,通过UDP/TCP转发日志消息到远程服务器,适用于简单的集中式日志收集架构。
 - ompipe: 管道输出模块,将日志发送到命名管道,适用于与其他进程进行IPC通信的场景。
 - omstdout: 标准输出模块,将日志输出到标准输出,主要用于测试和调试目的。
 - omuxsock: Unix套接字输出模块,通过Unix域套接字发送消息,适用于本地进程间通信。
 
数据库存储模块:
- omclickhouse: ClickHouse数据库输出模块,适用于需要高性能分析大量日志数据的场景。
 - omlibdbi: 通用数据库输出模块,支持多种数据库的日志存储。
 - ommongodb: MongoDB输出模块,适用于需要存储非结构化或半结构化日志数据的场景。
 - ommysql: MariaDB/MySQL数据库输出模块,适合需要SQL查询能力的标准关系型数据库存储。
 - omoracle: Oracle数据库输出模块,适用于企业级环境中使用Oracle数据库存储日志。
 - ompgsql: PostgreSQL数据库输出模块,适合需要强大SQL能力和可靠性的场景。
 
消息队列和事件处理:
- omamqp1: AMQP 1.0消息输出模块,用于将日志发送到支持AMQP协议的消息队列。
 - omazureeventhubs: 微软Azure事件中心输出模块,适用于Azure云环境中的事件处理。
 - omczmq: ZeroMQ输出模块,适用于高性能分布式消息传递场景。
 - omkafka: Apache Kafka输出模块,适用于需要高吞吐量、可扩展的日志流处理系统。
 - omrabbitmq: RabbitMQ输出模块,适合需要可靠消息队列的场景。
 - omrelp: RELP(可靠事件日志协议)输出模块,提供可靠的日志传输,适用于不能容忍日志丢失的场景。
 
安全和认证模块:
- omdtls: DTLS协议输出模块,提供UDP上的安全传输,适用于需要加密但不想使用TCP的场景。
 - gt: GuardTime日志签名提供程序,用于日志完整性验证。
 - ksi: 无密钥签名基础设施提供程序,用于不依赖密钥的日志真实性验证。
 - rsyslog-ksi-ls12: KSI签名提供程序,用于日志签名和验证。
 
云和大数据集成:
- omelasticsearch: Elasticsearch输出模块,适用于需要全文搜索和分析日志的场景。
 - omhdfs: Hadoop文件系统输出模块,适合将日志直接存储到HDFS中进行大数据分析。
 - omhttpfs: Hadoop HTTPFS输出模块,通过HTTP接口将日志写入HDFS。
 
特殊用途模块:
- omhiredis: Redis输出模块,适用于需要高性能缓存和数据结构存储的场景。
 - omhttp: HTTP输出模块,通过HTTP协议发送日志,适用于与RESTful API集成。
 - omjournal: Systemd Journal输出模块,将日志写入systemd日志系统,适用于现代Linux系统。
 - ommail: 邮件输出模块,发送邮件通知,适用于重要事件的警报场景。
 - omprog: 程序集成输出模块,将日志传递给外部程序处理,适用于自定义处理逻辑。
 - omruleset: 规则集输出/包含模块,允许将消息传递到其他规则集进行处理。
 - omsendertrack: 发送者跟踪输出模块,跟踪消息来源,适用于监控和审计场景。
 - omsnmp: SNMP陷阱输出模块,将日志转换为SNMP陷阱,适用于网络监控环境。
 - omudpspoof: UDP欺骗输出模块,允许使用指定源地址发送UDP包,适用于特殊测试场景。
 - omusrmsg: 用户通知模块,向系统用户发送消息,适用于管理员通知场景。
 
3. rsyslog输入模块
标准网络输入模块:
- imtcp: TCP Syslog输入模块,通过TCP接收标准syslog消息,提供可靠的日志传输,适用于不能容忍数据丢失的场景。
 - impstcp: Plain TCP Syslog,提供类似imtcp但性能优化的TCP接收模块,适用于高吞吐量环境。
 - imudp: UDP Syslog输入模块,通过UDP接收syslog消息,具有较低延迟但不保证可靠性,适用于高容量低关键性日志场景。
 - imrelp: RELP(可靠事件日志协议)输入模块,提供可靠的日志传输机制,适合关键应用日志的可靠接收。
 - imdtls: DTLS协议输入模块,在UDP上提供安全传输,适用于需要加密但优先考虑UDP性能的场景。
 
本地系统输入模块:
- imuxsock: Unix套接字输入模块,从本地Unix域套接字接收消息,是接收本地应用日志的主要方式。
 - imklog: 内核日志输入模块,从内核获取日志消息,适用于监控系统和硬件事件。
 - imkmsg: /dev/kmsg日志输入模块,现代Linux系统中从/dev/kmsg读取内核日志的模块。
 - imsolaris: Solaris输入模块,专为Solaris操作系统设计的输入模块。
 - imjournal: Systemd Journal输入模块,从systemd日志系统读取日志,适用于现代Linux发行版。
 
文件和程序输入模块:
- imfile: 文本文件输入模块,监控文本文件变化并将内容作为日志消息处理,适用于接入非syslog应用的日志文件。
 - improg: 程序集成输入模块,从外部程序的标准输出读取数据作为日志,适合集成自定义数据源。
 - imdocker: Docker输入模块,专门用于从Docker容器收集日志,适用于容器化环境。
 - imtuxedoulog: Tuxedo ULOG输入模块,用于接收Oracle Tuxedo应用服务器的日志。
 
消息队列和事件源:
- imczmq: ZeroMQ输入模块,从ZeroMQ消息队列接收日志,适用于分布式架构。
 - imkafka: Apache Kafka输入模块,从Kafka主题读取消息,适合大规模日志聚合场景。
 - imhiredis: Redis输入模块,从Redis数据结构存储读取日志条目。
 - im3195: RFC3195输入模块,支持RFC3195协议的日志接收,适用于特定标准化环境。
 
网络和安全相关:
- imgssapi: GSSAPI Syslog输入模块,支持通过GSSAPI进行身份验证的syslog接收,适用于需要Kerberos等认证的环境。
 - impcap: 网络流量捕获模块,直接捕获网络数据包并将其转换为日志,适用于网络监控和安全分析。
 - imhttp: HTTP输入模块,通过HTTP协议接收日志数据,适用于与Web应用集成或跨防火墙传输日志。
 
监控和诊断模块:
- immark: 标记消息输入模块,定期生成标记消息,用于验证rsyslog是否正常运行。
 - imdiag: 诊断工具模块,提供rsyslog内部状态的诊断信息。
 - impstats: 内部计数器统计生成模块,周期性生成rsyslog内部性能统计信息,适用于监控和性能优化。
 - imbatchreport: 批量报告输入模块,用于生成批处理操作的报告,适用于大量日志处理后的汇总分析。
 
这些输入模块使rsyslog能够从多种来源收集日志数据,从标准网络协议到特定应用程序接口,为集中式日志管理提供了灵活性和广泛的兼容性。
4. rsyslog解析模块
rsyslog的解析模块在消息接收后处理消息内容,用于解析特定格式的日志消息或处理格式不规范的消息。这些模块让rsyslog能够灵活地适应各种日志格式,从标准的syslog格式到各种专有格式。
下面是一个综合示例,展示如何在同一个rsyslog配置中使用多个解析器处理不同类型的日志:
# 加载所需解析器模块
module(load="pmrfc3164")
module(load="pmrfc5424")
module(load="pmciscoios")
module(load="pmlastmsg")
module(load="pmnormalize")# 定义各类解析器
parser(name="rfc5424_parser" type="pmrfc5424")
parser(name="cisco_parser" type="pmciscoios")
parser(name="custom_app_parser" type="pmnormalize" rulebase="/etc/rsyslog.d/app_rules.rb")
parser(name="compress_repeats" type="pmlastmsg")# 应用解析器规则
# 1. 处理现代系统的结构化日志
if $fromhost contains "modern-server" then {parser(parser="rfc5424_parser")action(type="omfile" file="/var/log/structured/system.log")
}# 2. 处理网络设备日志
else if $fromhost-ip startswith "10.0.1." then {parser(parser="cisco_parser")action(type="omfile" file="/var/log/network/cisco.log")
}# 3. 处理自定义应用程序日志
else if $programname == "custom-app" then {parser(parser="custom_app_parser")action(type="omfile" file="/var/log/apps/custom-app.log")
}# 4. 为所有日志应用重复消息压缩
action(type="omfile" file="/var/log/all-messages.log"parser="compress_repeats")
 
这个配置示例展示了rsyslog解析模块的强大功能,它能够根据消息来源、内容和格式应用不同的解析策略,将各种日志格式转换为结构化数据,并进行适当的处理和存储。
4.1 pmrfc3164: RFC3164格式消息解析器
功能: 解析传统的BSD syslog格式(RFC3164)的消息。
格式说明: RFC3164格式通常包含优先级、时间戳、主机名和消息内容,但缺乏结构化数据支持。
示例消息:
<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8
 
适用场景: 处理大多数传统系统和应用程序生成的syslog消息,作为rsyslog的默认解析器,处理标准格式的日志。
配置示例:
module(load="pmrfc3164")template(name="rfc3164format" type="string" string="%timegenerated% %HOSTNAME% %syslogtag%%msg%\n")action(type="omfile" file="/var/log/syslog" template="rfc3164format")
 
4.2 pmrfc5424: RFC5424格式消息解析器
功能: 解析现代的结构化syslog格式(RFC5424)的消息。
格式说明: RFC5424提供了更严格的时间戳格式、版本号、结构化数据和其他元数据字段。
示例消息:
<165>1 2003-10-11T22:14:15.003Z mymachine.example.com evntslog - ID47 [exampleSDID@32473 iut="3" eventSource="Application" eventID="1011"] An application event log entry...
 
适用场景: 处理现代系统和应用程序生成的结构化日志,需要提取和处理结构化数据元素的环境。
配置示例:
module(load="pmrfc5424")template(name="rfc5424format" type="string" string="%timegenerated% %HOSTNAME% %syslogtag% %$!all-json%\n")action(type="omfile" file="/var/log/structured-syslog" template="rfc5424format")
 
4.3 pmrfc3164sd: 解析RFC3164消息中的RFC5424结构化数据
功能: 专门用于处理混合格式,即在RFC3164格式消息中包含RFC5424结构化数据的情况。
适用场景: 处理过渡期的日志系统,部分应用已支持结构化数据但仍使用传统消息格式,需要从传统格式中提取结构化信息的场景。
配置示例:
module(load="pmrfc3164sd")# 自定义规则使用pmrfc3164sd处理消息
parser(name="custom_rfc3164_parser" type="pmrfc3164sd")ruleset(name="parse_rfc3164sd" parser="custom_rfc3164_parser") {action(type="omfile" file="/var/log/structured-legacy.log")
}
 
4.4 pmciscoios: Cisco IOS设备日志解析器
功能: 专门解析来自Cisco IOS网络设备的日志消息格式。
示例消息:
<189>29: *Apr 29 2007 15:37:11.958 UTC: %SYS-5-CONFIG_I: Configured from console by vty0 (10.0.0.1)
 
适用场景: 网络运维环境,需要处理Cisco路由器、交换机等设备的日志,网络安全监控系统,需要解析和分析网络设备事件。
配置示例:
module(load="pmciscoios")# 定义模板提取Cisco设备特定字段
template(name="ciscoformat" type="string" string="%timegenerated% %$!cisco.facility%-%$!cisco.severity%-%$!cisco.mnemonic%: %$!cisco.message%\n")# 使用pmciscoios解析器处理来自Cisco设备的消息
parser(name="cisco_parser" type="pmciscoios")
if $fromhost-ip startswith '10.1.1.' then {parser(parser="cisco_parser")action(type="omfile" file="/var/log/cisco/network.log" template="ciscoformat")
}
 
4.5 pmdb2diag: IBM DB2诊断文件解析器
功能: 解析IBM DB2数据库生成的诊断日志文件格式。
示例消息:
2013-06-13-14.28.41.378108 I1182E377         LEVEL: Event
PID     : 1234                TID  : 5678
PROC    : db2sysc 0
INSTANCE: db2inst1            NODE : 000
FUNCTION: DB2 UDB, base sys utilities, sqeLocalDatabase
MESSAGE : ADM7513W  Database "SAMPLE" is being activated.
 
适用场景: 数据库管理员监控DB2数据库运行状态,数据库性能分析和问题排查,集中式日志管理系统中整合DB2诊断信息。
配置示例:
module(load="imfile")  # 用于读取DB2诊断文件
module(load="pmdb2diag")  # 用于解析DB2诊断内容input(type="imfile"File="/database/db2inst1/sqllib/db2dump/db2diag.log"Tag="db2diag:"StateFile="db2diag-state"Facility="local7"Severity="notice")# 定义DB2特定解析器
parser(name="db2diag_parser" type="pmdb2diag")# 应用解析器到DB2日志
if $syslogtag contains 'db2diag:' then {parser(parser="db2diag_parser")# 将解析后的结构化DB2日志写入专用文件action(type="omfile" file="/var/log/db2/diagnostics.log")
}
 
4.6 pmlastmsg: "最后一条消息重复n次"处理器
功能: 识别并处理重复消息,将连续重复的相同消息合并为单个带计数的消息。
示例: 如果原始日志中有多条相同的消息:
Disk space low on /dev/sda1
Disk space low on /dev/sda1
Disk space low on /dev/sda1
 
pmlastmsg会将其合并为:
Disk space low on /dev/sda1
last message repeated 2 times
 
适用场景:
- 减少日志文件体积,避免重复消息占用存储空间
 - 提高日志可读性,避免被大量重复消息淹没
 - 适用于频繁生成相同错误或警告消息的系统
 
配置示例:
module(load="pmlastmsg")# 配置最后消息重复处理
parser(name="last_message_repeats" type="pmlastmsg")# 应用这个解析器到所有消息
action(type="omfile" file="/var/log/messages" parser="last_message_repeats")
 
4.7 pmnormalize: 日志消息标准化解析器
功能: 基于规则定义将各种格式的日志转换为标准化结构,类似于liblognorm库的功能。
适用场景:
- 处理非标准或自定义日志格式
 - 将异构系统的日志统一为一致的格式
 - 从自由格式文本中提取结构化数据
 
配置示例:
module(load="pmnormalize")# 加载规则文件
parser(name="custom_parser"type="pmnormalize"rulebase="/etc/rsyslog.d/custom_rules.rb")# 应用解析器到特定日志源
if $fromhost-ip == '192.168.1.10' then {parser(parser="custom_parser")action(type="omfile" file="/var/log/normalized/app1.log")
}
 
规则文件示例 (custom_rules.rb):
# Apache访问日志规则
rule=:%client_ip:ipv4% %ident:word% %user:word% [%timestamp:date-rfc3339%] "%request:word% %url:word% HTTP/%http_version:float%" %status:number% %bytes:number% "%referrer:char-to:\"%"  "%user_agent:char-to:\"%"
 
4.8 pmnull: Null解析器模块
功能: 一个不执行任何解析的透传解析器,通常用于调试或特殊场景。
适用场景: 诊断消息流中的解析问题,绕过解析步骤直接处理原始消息,自定义处理链中的占位符。
配置示例:
module(load="pmnull")# 定义null解析器
parser(name="do_nothing" type="pmnull")# 对特定消息应用null解析器
if $msg contains "DONOTPARSE" then {parser(parser="do_nothing")action(type="omfile" file="/var/log/raw_messages.log")
}
 
5. 消息修改模块
Message Modification Modules 是用于更改正在处理的消息内容的模块。这些模块可以通过输出模块或解析器模块接口实现。从 rsyslog 核心的角度来看,它们实际上是输出或解析器模块,它们的特殊性在于其实现方式。
以下是各种消息修改模块的简要介绍:
- mmaitag:基于 AI 的分类模块,用于智能标记和分类消息
 - mmanon:IP 地址匿名化模块,用于保护隐私并符合数据保护规定
 - mmaudit:Linux 审计日志解析器,专门用于处理 Linux 审计日志
 - mmcount:计数模块,用于消息统计和计数功能
 - mmdarwin:Darwin 连接器,提供与 Darwin 系统的集成
 - mmdblookup:MaxMind/GeoIP 数据库查询模块,支持地理位置信息查找
 - mmfields:字段提取模块,用于从消息中提取指定字段
 - mmjsonparse:JSON 结构化内容提取模块,用于解析 JSON 格式的日志
 - mmjsonrewrite:JSON 点号键重写器,用于重新组织 JSON 数据结构
 - mmjsontransform:JSON 点号键转换器,提供多种 JSON 数据转换模式
 - mmkubernetes:Kubernetes 元数据模块,集成 Kubernetes 集群信息
 - mmleefparse:LEEF 结构化内容提取模块,用于解析 LEEF 格式日志
 - mmnormalize:日志消息标准化模块,使消息格式一致化
 - mmpstrucdata:RFC5424 结构化数据解析模块,处理符合该标准的日志
 - mmrfc5424addhmac:为 RFC5424 消息添加 HMAC 认证码
 - mmrm1stspace:第一空格修改模块,处理特定格式问题
 - mmsequence:数字生成器和计数器模块,提供序列号功能
 - mmsnareparse:NXLog Snare Windows 安全解析器,专用于 Windows 安全日志
 - mmsnmptrapd:SNMP 陷阱消息修改模块,处理 SNMP 监控数据
 - mmtaghostname:主机名标记模块,添加主机标识信息
 - mmutf8fix:修复无效 UTF-8 序列的模块,确保字符编码正确
 
这些模块提供了丰富的功能,可以灵活地处理、转换和增强各种日志和消息格式。
