rsyslog精准过滤关键故障日志需聚焦emerg、alert、crit、err四级,排除notice及以下级别;配置中用分号连接多条件,如.emerg;.alert;.crit;.err /var/log/critical.log,并支持tcp加密远程转发。

要让 Syslog 只转发和记录关键故障信息,核心不是“关掉其他日志”,而是精准筛选、分级拦截、定向落盘——重点抓住 emerg、alert、crit、err 这四级真正影响业务可用性的日志,同时排除 notice、info、debug 等干扰项。
明确哪些才算“关键故障”
根据 RFC 5424 标准,真正需要立即响应的故障级日志只有以下四类:
- emerg(0):系统崩溃、内核 panic、关键服务完全不可用
- alert(1):需秒级人工介入,如数据库主节点失联、证书过期、权限策略被篡改
- crit(2):严重功能受损,如磁盘写满、认证服务宕机、网络接口持续 down
- err(3):明确失败事件,如服务启动失败、API 返回 5xx、SSH 登录被拒超限
notice 及以下级别(如用户登录成功、定时任务完成)不构成故障,不应进入关键日志流。
rsyslog 中实现精准过滤
在 /etc/rsyslog.d/99-critical-only.conf 中配置,避免修改主文件:
- 停用默认全量转发:
*.* /var/log/messages这类通配规则必须注释或删除 - 只接收关键级别:
*.emerg;*.alert;*.crit;*.err /var/log/critical.log - 按设施再收紧(可选):
authpriv.err;authpriv.crit;authpriv.alert;authpriv.emerg /var/log/auth_critical.log - 丢弃非关键日志:
*.notice;*.info;*.debug ~(波浪号表示丢弃)
注意:facility 和 severity 必须用分号连接,多个条件用分号分隔,不能用逗号。
远程转发时同步过滤
若需将关键日志发往 SIEM 或集中服务器,务必在转发前过滤,避免带宽浪费和远端存储污染:
- TCP 加密转发(推荐):
*.emerg;*.alert;*.crit;*.err @@logserver.example.com:6514(双@ 表示 TCP) - 配合 TLS 认证时,过滤仍写在 action 前,例如:
if $syslogseverity (rsyslog v8+ 支持表达式语法) - 严禁使用
*.* @...再靠远端过滤——本地不控,流量和风险都已外溢
验证与日常维护
配置生效后,用几条典型测试日志确认行为是否符合预期:
- 触发 err 级别:
logger -p local0.err "disk full test"→ 应出现在/var/log/critical.log - 触发 info 级别:
logger -p local0.info "config reload success"→ 不应写入任何关键日志文件 - 检查丢弃效果:
rsyslogd -N1验证语法;journalctl -u rsyslog | grep -i "invalid\|drop"查异常
定期 review /var/log/critical.log 的日志密度——如果每小时超过 10 条,说明筛选还不够严,可能混入了误标为 err 的常规操作日志。











