Nginx error_log 可通过 syslog 协议直发本地 rsyslog(如 error_log syslog:server=127.0.0.1:514,facility=local7 warn;),由 rsyslog 串行写入、按级别分流(如 local7.=error /var/log/nginx/error_error.log)、轮转及转发,避免多进程竞态与重复写入。

直接让 Nginx 的 error_log 输出到 syslog,再由 rsyslog 或 syslog-ng 统一接收、过滤、分发和存储,是最稳妥、可扩展的统一收集方式。Nginx 本身不合并多进程日志,也不支持按错误级别自动分流,但通过 syslog 协议中继,这些问题自然解决。
配置 Nginx 使用 syslog 输出 error_log
Nginx 1.7.0+ 原生支持 syslog: 协议写入错误日志。在 http、server 或全局块中修改或添加:
error_log syslog:server=127.0.0.1:514,facility=local7 warn;- 其中
server=127.0.0.1:514指向本地 rsyslog;facility=local7是分类标识,需和服务端规则匹配;warn表示只发送 warning 及以上级别(warn / error / crit / alert / emerg) -
注意:
error_log syslog:不支持tag、severity等参数(这些由 syslog 协议栈处理),如需更精细控制,建议用access_log syslog:+ 自定义 error 日志模块,或改用 pipe 方式 - 原有
error_log /var/log/nginx/error.log;应注释掉,避免重复写入和权限冲突
配置 rsyslog 接收并路由 error 日志
rsyslog 负责串行化写入、按优先级分流、轮转和转发。以 /etc/rsyslog.d/nginx.conf 为例:
- 确保监听 UDP/TCP 514(推荐同时启用):
$ModLoad imudp<br>$UDPServerRun 514<br>$ModLoad imtcp<br>$InputTCPServerRun 514
- 按 syslog priority 分流(
local7对应 Nginx 错误):local7.=emerg /var/log/nginx/error_emerg.log<br>local7.=alert /var/log/nginx/error_alert.log<br>local7.=crit /var/log/nginx/error_crit.log<br>local7.=err /var/log/nginx/error_error.log<br>local7.=warning /var/log/nginx/error_warn.log<br>local7.* /var/log/nginx/error_all.log & stop
- 每条规则末尾加
& stop防止日志被后续规则重复匹配
增强可靠性与安全性(可选)
生产环境建议进一步加固:
- 用 TCP 替代 UDP:在 Nginx 中写
error_log syslog:server=tcp://127.0.0.1:514,facility=local7 warn;,避免丢包 - 启用 TLS 加密:rsyslog 配置
gtls模块,将日志加密转发至远程中心(Nginx 本身不参与加密,由 rsyslog 完成) - 限制来源:rsyslog 中用
$AllowedSender UDP, 127.0.0.1或防火墙策略只允本机连接 - 配合 logrotate:对
/var/log/nginx/*.log做轮转,并在postrotate中执行kill -HUP $(cat /var/run/syslogd.pid)或systemctl kill -s HUP rsyslog
验证是否生效
操作后快速检查几个关键点:
- 重启服务:
systemctl restart rsyslog nginx - 手动触发一条错误(如访问不存在的 upstream):
curl -I http://localhost/bad - 查看 rsyslog 是否收到:
tail -f /var/log/nginx/error_error.log - 确认 rsyslog 进程监听状态:
ss -tuln | grep :514 - 检查 Nginx 错误日志是否为空(说明已成功转向 syslog)


















