rsyslog 日志级别通过 facility+priority 组合控制,而非 level=xxx;优先级从高到低为 emerg、alert、crit、err、warning、notice、info、debug;可用 *.warning 等规则限制输出级别,修改后需重启 rsyslog 服务。

Linux 系统中 rsyslog 的日志级别不是直接在 配置文件 里用“level=xxx”设置的,而是通过 日志设施(facility)+ 优先级(priority)组合来过滤和 路由 日志。调整的关键在于修改 /etc/rsyslog.conf 或/etc/rsyslog.d/*.conf中的规则行,控制哪些日志被记录、写入何处、是否转发。
理解日志优先级(priority)与匹配逻辑
rsyslog 支持 8 个标准优先级,从高到低依次为:emerg、alert、crit、err、warning、notice、info、debug。规则中常用的是“>=”、“==”、“.*”等操作符:
-
*.info表示所有 facility 的 info 及以上级别(即 info、notice、warning、err……) -
mail.*表示 m ail facility 的所有级别日志 -
authpriv.=info表示 authpriv facility 的 恰好info 级别(不包含 notice 或 debug) -
daemon.!info表示 daemon facility 中 排除info 级别(即只记录其他级别)
调整本地日志输出级别(例如限制 /var/log/messages 只存 warn 以上)
编辑/etc/rsyslog.d/50-default.conf(或主配置中对应规则),找到类似这一行:
*.*;auth,authpriv.none -/var/log/syslog
若只想让 /var/log/messages 保存 warning 及以上日志,可改为:
*.warning;auth,authpriv.none -/var/log/messages
注意:该行末尾的 - 表示异步写入(提升性能),保留即可。改完后需重启服务生效:
sudo systemctl restart rsyslog
限制特定程序或服务的日志量(如减少 sshd 调试日志)
如果某服务(如 sshd)开启了 debug 日志导致 /var/log/auth.log 暴增,可在 rsyslog 配置中单独拦截:
- 新建
/etc/rsyslog.d/20-sshd-limit.conf - 加入规则:if $programname == ‘sshd’ and $syslogseverity(6=info,即只记录 info 及更严重级别)
- 再加一行:if $programname == ‘sshd’ and $syslogseverity(防止日志被后续规则重复处理)
这样既保留必要日志,又避免 debug 刷屏。记得测试语法:sudo rsyslogd -N1,无报错再重启。
验证与排查技巧
调整后建议立即验证效果:
- 用
logger -p daemon.info "test info"和logger -p daemon.debug "test debug"分别发两条日志 - 检查目标文件(如
/var/log/messages)是否只收到 info 那条 - 查看 rsyslog 运行状态:
sudo systemctl status rsyslog,留意是否有“invalid selector”类错误 - 开启 rsyslog 调试日志(临时):
sudo rsyslogd -dn 2>&1 | grep -i "filter|rule",可直观看到每条日志匹配了哪条规则
不复杂但容易忽略的是:rsyslog 按配置文件顺序逐行匹配,stop语句会终止后续处理,合理使用能精准控流。