rsyslog可通过ruleset和property-based filter(如$msg、$programname)结合if判断与call调用实现日志精准分流;支持大小写敏感/不敏感匹配、多字段组合过滤、模板格式化及结构化日志解析,并需通过-N1语法检查和debug验证配置有效性。

rsyslog 可以通过规则集(ruleset)和过滤条件,对日志按关键字进行精准分流,再写入不同文件归档。关键在于合理使用 property-based filter(如 $msg、$programname)配合 if 判断和 call 调用独立 ruleset。
匹配关键字并路由到指定 ruleset
在主配置中定义条件判断,将含特定关键词的日志交由专用 ruleset 处理。例如捕获包含 "ERROR" 或 "timeout" 的消息:
- 使用
if $msg contains "ERROR" or $msg contains "timeout"进行字符串匹配 - 匹配成功后执行
call error_ruleset,跳转到预定义的 ruleset - 注意:匹配是大小写敏感的,如需忽略大小写,改用
re_match($msg, "error|timeout")(需启用mmnormalize或使用rsyslog 8.0+的原生正则支持)
定义专用 ruleset 实现分类归档
ruleset 是隔离的日志处理单元,可独立设置 action(如写入文件),避免干扰主流程:
- 用
ruleset(name="error_ruleset") { ... }声明新 ruleset - 内部用
*.* /var/log/app_errors.log直接写入目标文件 - 可叠加
stop阻止后续规则匹配,防止重复记录 - 支持模板(template)自定义格式,比如只保留时间、程序名和原始消息:
template(name="shortfmt" type="string" string="%timegenerated% %programname%: %msg%\n")
结合 programname 和 facility 精准过滤
单靠 $msg 容易误匹配,建议组合字段提升准确性:
-
if $programname == 'nginx' and ($msg contains "404" or $msg contains "502")只抓 Nginx 的特定错误 -
if $syslogfacility-text == 'local3' and $msg startswith "ALERT:"按自定义 facility + 前缀筛选 - 用
property("msg", "json")提取结构化日志中的字段(需开启imjournal或mmjsonparse)
验证与调试技巧
配置生效前务必测试,避免漏写或逻辑冲突:
- 重启前运行
rsyslogd -N1检查语法错误 - 启用 debug 日志:
rsyslogd -dn 2>&1 | grep -i "error_ruleset"观察是否命中规则 - 手动触发测试日志:
logger -t myapp "ERROR: connection timeout",检查目标文件是否生成 - 注意 ruleset 的加载顺序 ——
call必须在对应 ruleset 定义之后,否则报错

















