Nginx日志可通过syslog交由rsyslog统一管理:1. 修改nginx.conf用syslog输出access_log,error_log仅支持简写;2. 配置rsyslog监听514端口并按facility/tag路由至独立文件;3. 用logrotate轮转并HUP rsyslog。

YUM 安装 Nginx 后,默认日志由 Nginx 自己管理(access.log 和 error.log),不走 rsyslog。若想让 Nginx 日志经由 rsyslog 统一收集、轮转或转发(比如发到远程日志服务器),需手动配置 Nginx 输出到 syslog,并调整 rsyslog 接收规则,同时分离出独立日志文件。
1. 修改 Nginx 配置,将日志输出到 syslog
Nginx 1.7.1+ 原生支持 syslog: 协议。编辑主配置(如 /etc/nginx/nginx.conf)或站点配置,在 http、server 或 location 块中替换原有 access_log 指令:
- 将
access_log /var/log/nginx/access.log;改为:
- 将
error_log /var/log/nginx/error.log warn;改为(注意 error_log 不支持 full syslog URL,仅支持简写形式):
⚠️ 注意:error_log syslog: 默认使用 local7 设施(facility),且无法指定 tag 或 port;如需自定义,建议统一用 access_log syslog: + 自定义 error 日志模块(如通过 Lua)或保留 error_log 文件方式,只对 access 日志走 syslog。
2. 配置 rsyslog 接收并路由到独立文件
确保 rsyslog 正在监听 UDP 514(生产环境建议也启用 TCP)。编辑 /etc/rsyslog.conf 或新建配置文件(推荐 /etc/rsyslog.d/99-nginx.conf):
- 启用 UDP(和/或 TCP)输入模块(取消注释或添加):
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
- 添加规则,按 facility 和 tag 分离 Nginx 日志:
if $syslogfacility-text == 'local7' and $programname == 'nginx_access' then /var/log/nginx/access-syslog.log
& stop
# 可选:捕获 Nginx error(默认走 local7,无 tag,需谨慎匹配避免误伤)
if $syslogfacility-text == 'local7' and $programname startswith 'nginx' and $msg contains 'error' then /var/log/nginx/error-syslog.log
& stop
✅ 保存后重启服务:systemctl restart rsyslog nginx
3. 设置日志轮转(logrotate)
rsyslog 不自动轮转,需配合 logrotate。创建 /etc/logrotate.d/nginx-syslog:
/var/log/nginx/error-syslog.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0644 nginx root
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2>/dev/null` 2>/dev/null || true
endscript
}
⚠️ 注意:HUP rsyslog 的 PID 路径可能为 /var/run/rsyslogd.pid(取决于系统版本),请确认后修改;CentOS 7+ 推荐用 systemctl kill --signal=HUP rsyslog 替代。
4. 验证与排错要点
- 检查 Nginx 是否成功发送日志:
tcpdump -i lo udp port 514 -A(看是否有 nginx_access 字样) - 确认 rsyslog 是否收到:
tail -f /var/log/messages | grep nginx - 查看目标日志文件是否生成且有内容:
ls -l /var/log/nginx/*.log、tail -n 5 /var/log/nginx/access-syslog.log - 常见问题:SELinux 阻止 UDP 514(临时关闭测试:
setenforce 0);firewalld 拦截本地 514 端口(通常不影响 loopback,但需确认);rsyslog 配置语法错误(运行rsyslogd -N1检查)
不复杂但容易忽略细节,重点是 Nginx 的 syslog 输出格式、rsyslog 的 facility/tag 匹配、以及 logrotate 的 HUP 机制协同工作。


















