Nginx 1.7.1+原生支持syslog日志输出,可配置access_log和error_log直连远程UDP/TCP syslog服务,需正确设置server、facility、tag、severity及log_format,并验证网络连通性与rsyslog接收规则。

从 Nginx 1.7.1 开始,官方原生支持将 access_log 和 error_log 直接输出到 syslog 设备(包括远程 UDP/TCP 端点),无需额外模块或中间转发器。关键在于正确配置 syslog: 协议地址、日志级别与格式,并确保网络和远端 syslog 服务就绪。
启用 syslog 日志输出(access_log 和 error_log)
Nginx 支持在 http、server 或 location 块中分别配置。示例:
-
Access 日志推送到远程 syslog(UDP):
access_log syslog:server=192.168.10.50:514,facility=local7,tag=nginx_access,severity=info main; -
Error 日志也走 syslog(TCP,更可靠):
error_log syslog:server=192.168.10.50:514,facility=local7,tag=nginx_error,severity=error;
说明:
• server=IP:PORT 必须可达,UDP 默认丢包不重传,生产环境建议用 tcp:// 前缀(如 syslog:server=tcp://192.168.10.50:514);
• facility 影响日志分类(如 local0–local7),需与远端 rsyslog/syslog-ng 配置匹配;
• tag 是日志前缀标识,便于远端过滤;
• severity 控制发送的日志级别(debug/info/warn/error/crit 等);
• main 是自定义 log_format 名称(需提前定义)。
定义兼容 syslog 的日志格式(可选但推荐)
默认的 combined 格式含空格和特殊字符,可能影响 syslog 解析。建议精简并避免双引号嵌套:
- 在
http块中添加:log_format syslog_fmt '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; - 然后在
access_log中引用:access_log syslog:server=... syslog_fmt;
注意:Nginx 会自动为 syslog 消息添加 RFC5424 头部(时间戳、hostname、tag 等),你定义的 format 仅作为消息体(MSG 部分)。
验证与排错要点
配置后务必测试连通性与权限:
- 确认 Nginx 所在机器能访问远端 syslog 端口:
nc -zv 192.168.10.50 514(TCP)或echo "test" | nc -u 192.168.10.50 514(UDP) - 检查 Nginx 配置语法:
nginx -t,再重载:nginx -s reload - 查看 Nginx error_log 本身是否报错(如 “syslog: server unavailable” 或 “permission denied”)
- 远端 rsyslog 需监听对应协议和端口(例如
$ModLoad imudp+$UDPServerRun 514),且local7.* /var/log/nginx-remote.log规则需存在
进阶:按 location 分流日志到不同 syslog tag
可在不同 location 块中指定独立 access_log syslog:...,实现按路径分离日志流:
location /api/ { access_log syslog:server=tcp://192.168.10.50:514,facility=local6,tag=nginx_api; }location /static/ { access_log syslog:server=tcp://192.168.10.50:514,facility=local5,tag=nginx_static; }
远端 rsyslog 可据此 tag 写入不同文件或转发至不同分析平台(如 ELK、Loki)。


















