4. rsyslog 配置文件语法:rsyslog.conf 结构、规则行语法、模板与动作

rsyslog 的配置文件 rsyslog.conf 是系统日志路由的核心。理解其语法结构,是进行日志分类、格式化与远程转发的基石。本章将深入剖析配置文件的三大核心要素:文件结构、规则行 (Rule Line)、模板 (Template) 与 动作 (Action)。

4.1 rsyslog.conf 文件结构

一个典型的 rsyslog.conf 文件由三大部分组成,通常按顺序排列:

模块 说明 示例
全局配置 (Global Directives) 设置守护进程的全局行为,如工作目录、模块加载、权限、队列参数等。 $ModLoad imuxsock
$WorkDirectory /var/spool/rsyslog
模块加载 (Module Loading) 加载输入、输出、解析等模块。例如 imuxsock(本地套接字)、imklog(内核日志)、imtcp/imudp(网络接收)。 module(load="imtcp")
input(type="imtcp" port="514")
规则行 (Rules) 定义日志的筛选条件与输出目标。这是配置的核心部分,决定了日志的去向。 mail.info /var/log/maillog
*.emerg :omusrmsg:*
最佳实践: 建议将自定义规则写入 /etc/rsyslog.d/ 目录下的独立 .conf 文件中,并通过主配置文件中的 $IncludeConfig /etc/rsyslog.d/*.conf 引入,便于管理和维护。

4.2 规则行 (Rule Line) 语法

规则行是 rsyslog 配置的核心逻辑单元,其标准语法格式为:

selector  action

Selector(选择器) 由 设施 (Facility) 和 优先级 (Priority) 组成,中间用点号 . 分隔。多个选择器可用分号 ; 分隔。

Action(动作) 定义日志的输出目标,可以是本地文件、远程服务器、用户终端或管道等。

4.2.1 设施 (Facility) 与优先级 (Priority)

设施 (Facility) 说明 优先级 (Priority) 说明
kern 内核消息 emerg 紧急状态 (0)
user 用户级消息 alert 必须立即处理 (1)
mail 邮件系统 crit 严重状态 (2)
daemon 系统守护进程 err 错误状态 (3)
auth 安全/认证消息 warning 警告状态 (4)
syslog syslogd 内部消息 notice 正常但重要 (5)
lpr 打印系统 info 信息性消息 (6)
news 新闻组系统 debug 调试消息 (7)
local0 - local7 自定义设施(常用) * 所有优先级
* 所有设施 none 排除该设施

4.2.2 选择器比较符

除了标准的点号 .,rsyslog 还提供了更精确的比较符:

  • . (点号):表示“大于等于”指定优先级。例如 mail.err 匹配 mail 设施的 err、crit、alert、emerg 级别。
  • .= (点等号):表示“等于”指定优先级。例如 mail.=err 只匹配 mail 设施的 err 级别。
  • .! (点感叹号):表示“排除”指定优先级及更高。例如 mail.!err 匹配 mail 设施的 debug、info、notice、warning 级别。

4.2.3 规则行示例

# 将所有内核日志(除调试信息外)写入 /var/log/kern.log
kern.*;kern.!debug                        /var/log/kern.log

# 将所有设施的 info 及以上级别日志(除 mail 和 authpriv)写入 /var/log/messages
*.info;mail.none;authpriv.none            /var/log/messages

# 将所有设施的 emerg 级别日志广播到所有登录用户
*.emerg                                   :omusrmsg:*

# 将 local0 设施的 crit 及以上级别日志发送到远程服务器
local0.crit                               @@192.168.1.100:514
规则行 (Rule Line) 解析流程 原始日志消息 选择器匹配 动作执行 选择器分解 设施 (Facility) . 优先级 (Priority) 示例: mail.err 动作分解 文件: /var/log/maillog 远程: @@192.168.1.100:514

4.3 模板 (Template)

模板用于定义日志消息的输出格式。rsyslog 提供了丰富的内置模板,也支持用户自定义模板。模板在远程日志收集中尤为重要,因为它决定了接收端解析日志的难易程度。

4.3.1 模板定义语法

template(name="TemplateName" type="string" string="%msg% %timegenerated%\\n")
template(name="TemplateName" type="list") {
    constant(value="[")
    property(name="timereported" dateFormat="rfc3339")
    constant(value="] ")
    property(name="msg")
    constant(value="\\n")
}
  • type="string":使用字符串格式,通过 %property% 引用属性。
  • type="list":使用列表格式,更灵活,支持 constant() 和 property() 函数。

4.3.2 常用内置属性

属性名 说明 示例输出
%msg% 日志消息内容 pam_unix(su:session): session opened for user root
%hostname% 主机名 web-server-01
%syslogtag% 程序标签 sshd[12345]
%timegenerated% 日志生成时间 2025-03-15T10:30:00.123456+08:00
%syslogfacility-text% 设施名称 authpriv
%syslogseverity-text% 优先级名称 info
%fromhost-ip% 发送方 IP 地址 192.168.1.10

4.3.3 模板应用示例

# 定义 JSON 格式模板,用于远程收集
template(name="json-template" type="list") {
    constant(value="{")
    constant(value="\"timestamp\": \"")    property(name="timereported" dateFormat="rfc3339")
    constant(value="\", \"host\": \"")     property(name="hostname")
    constant(value="\", \"facility\": \"") property(name="syslogfacility-text")
    constant(value="\", \"severity\": \"") property(name="syslogseverity-text")
    constant(value="\", \"tag\": \"")      property(name="syslogtag")
    constant(value="\", \"message\": \"")  property(name="msg")
    constant(value="\"}")
    constant(value="\\n")
}

# 在动作中引用模板
local0.*  action(type="omfwd" target="192.168.1.100" port="514" protocol="tcp"
                 template="json-template")

4.4 动作 (Action)

动作定义了日志的最终去向。rsyslog 支持多种动作类型,以下是最常用的几种:

动作类型 语法示例 说明
写入文件 /var/log/local0.log 将日志追加到本地文件。支持 - 前缀(同步写入)和 ? 前缀(动态文件名)。
发送到远程 @@192.168.1.100:514 @ 表示 UDP,@@ 表示 TCP。推荐使用 TCP 保证可靠性。
发送给用户 :omusrmsg:root,admin 将消息写入指定用户的终端。使用 * 表示所有登录用户。
执行程序 ^/usr/local/bin/log-alert.sh 将日志消息通过管道传递给外部程序。程序的标准输入会收到日志内容。
丢弃日志 ~ 丢弃匹配的日志消息。常用于过滤敏感或重复日志。
写入数据库 :ommysql:localhost,Syslog,user,pass 将日志写入 MySQL 数据库。需要加载 ommysql 模块。
注意: 使用 ^ 动作执行外部程序时,如果程序执行缓慢或挂起,可能会阻塞 rsyslog 的主处理循环。建议在程序内部实现超时机制,或使用 omprog 模块进行更安全的异步执行。

4.5 综合配置示例

以下是一个完整的 /etc/rsyslog.d/remote.conf 示例,展示了规则行、模板和动作的协同工作:

# 加载 TCP 模块
module(load="imtcp")
input(type="imtcp" port="514")

# 定义 JSON 模板
template(name="json-format" type="list") {
    constant(value="{")
    constant(value="\"@timestamp\": \"")    property(name="timereported" dateFormat="rfc3339")
    constant(value="\", \"host\": \"")      property(name="hostname")
    constant(value="\", \"facility\": \"")  property(name="syslogfacility-text")
    constant(value="\", \"severity\": \"")  property(name="syslogseverity-text")
    constant(value="\", \"program\": \"")   property(name="programname")
    constant(value="\", \"pid\": \"")       property(name="procid")
    constant(value="\", \"message\": \"")   property(name="msg")
    constant(value="\"}")
    constant(value="\\n")
}

# 规则行:将 local0 设施的 crit 及以上级别日志发送到远程
local0.crit  action(type="omfwd"
                    target="192.168.1.100"
                    port="514"
                    protocol="tcp"
                    template="json-format"
                    queue.type="linkedlist"
                    queue.size="10000")

# 规则行:将所有设施的 info 及以上级别日志写入本地文件
*.info;mail.none;authpriv.none;cron.none  /var/log/messages

# 规则行:将内核的 emerg 级别日志广播给所有用户
kern.emerg  :omusrmsg:*
关键点总结:
  • 选择器 决定“哪些日志”,动作 决定“去哪”。
  • 模板 是日志格式化的核心工具,尤其在远程收集中必须显式定义。
  • 动作 支持多种目标,远程转发推荐使用 TCP 协议。
  • 配置修改后,使用 rsyslogd -N1 进行语法检查,确认无误后再重启服务。