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
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进行语法检查,确认无误后再重启服务。