Rsyslog可通过if条件语句结合facility和severity匹配实现日志分级路由;severity范围0~7,对应emerg至debug,支持符号名或数字匹配,如$syslogseverity-text=='err'。

在 Linux 中,Rsyslog 可以根据日志的 facility 和 severity(即优先级)做条件判断,并将匹配的日志路由到不同输出目标,比如邮件、HTTP 接口、自定义脚本或外部消息队列。关键在于合理使用 if 条件语句 + 模块(如 ommail、omhttp、omprog)实现分级告警分发。
1. 理解日志优先级与匹配语法
Rsyslog 的 severity 是数字(0~7),对应:
0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug
你可在配置中用符号名(推荐)或数字匹配。例如:
if $syslogseverity-text == 'err' or $syslogseverity-text == 'crit' then ...if $syslogseverity (匹配 crit 及以上严重级别)- 注意:条件语句必须写在
module(load="...")后,且then后需接动作(如写文件、调模块)
2. 配置邮件通道(高优:emerg/alert/crit)
先启用 ommail 模块(部分系统需安装 rsyslog-mmmail 或编译支持):
- 在
/etc/rsyslog.conf或/etc/rsyslog.d/50-alert-mail.conf中添加: module(load="ommail" mail.from="rsyslog@localhost" mail.to="admin@example.com" mail.server="localhost")- 再写规则:
if $syslogseverity - 建议搭配模板(
template(name="MailFormat" type="string" string="%timegenerated% %HOSTNAME% %syslogtag%%msg%\n"))提升可读性
3. 配置 Webhook 通道(中优:err/warning)
使用 omhttp 模块推送 JSON 到告警平台(如 Prometheus Alertmanager、企业微信、钉钉):
- 加载模块:
module(load="omhttp" template="json-template") - 定义 JSON 模板:
template(name="json-template" type="list") {<br> constant(value="{\"level\":\"")<br> property(name="syslogseverity-text")<br> constant(value="\",\"host\":\"")<br> property(name="hostname")<br> constant(value="\",\"msg\":\"")<br> property(name="msg" format="json")<br> constant(value="\"}")<br> } - 匹配并发送:
if $syslogseverity == 3 or $syslogseverity == 4 then action(type="omhttp" server="webhook.example.com" port="443" uri="/alert" restype="application/json" timeout="5")
4. 配置本地脚本通道(低优/审计类:notice/info)
对非紧急但需记录的日志,用 omprog 调用 Python/Shell 脚本做归档、去重或入库:
- 启用模块:
module(load="omprog") - 写规则:
if $syslogseverity >= 5 and $syslogseverity - 脚本需从 stdin 读取日志(每行一条),处理后返回 0 表示成功;避免阻塞,建议异步写入或加超时
- 注意:确保脚本有执行权限,且 rsyslog 用户(通常是
syslog或rsyslog)能访问所需资源
不复杂但容易忽略:所有条件规则应放在全局配置之后、默认日志写入规则之前(如 *.* /var/log/messages),否则日志可能被提前消费而无法触发后续动作;修改后运行 sudo rsyslogd -N1 校验语法,再 sudo systemctl restart rsyslog 生效。


















