Nginx 1.7.0+ 原生支持 syslog 协议日志,需关闭本地日志、正确配置 syslog 地址与参数,并精简 log_format 防截断,服务端 rsyslog 需按 facility 监听并路由。

直接用 syslog: 协议就能实现,Nginx 1.7.0+ 原生支持,无需额外模块或中间件,但必须关本地日志、选对协议、配准参数,否则日志会静默丢失。
确认版本并彻底关闭本地日志
运行 nginx -v 确保版本 ≥ 1.7.0。低于该版本不识别 syslog: 指令,配置会被忽略。
- 注释或删除所有形如
access_log /var/log/nginx/access.log的行 - 显式关闭:写
access_log off;和error_log /dev/null error;(1.11.6+ 支持error_log syslog:,低版本建议先关掉) - 切勿留空的
access_log指令——Nginx 会回退到默认路径,导致双写或权限冲突
配置 access_log 使用 syslog 协议
在 http、server 或 location 块中添加指令,格式为:access_log syslog:server=地址:端口,参数1=值1,参数2=值2 格式名;
- 推荐 TCP 协议提升可靠性:
access_log syslog:server=tcp://192.168.10.50:601,facility=local7,tag=nginx_access,severity=info main; - UDP 示例(轻量但不可靠):
access_log syslog:server=192.168.10.50:514,facility=local7,tag=nginx_access,severity=info main; -
facility推荐用local0–local7,避免与系统日志冲突;远端 rsyslog 必须匹配(如local7.* /var/log/nginx-remote.log) -
tag会成为 syslog 报文中的 PROGRAMNAME 字段,Logstash 过滤时靠它识别来源,不能含空格或特殊字符
定义兼容 syslog 的日志格式
默认 combined 格式含嵌套双引号和不规整空格,易被 rsyslog 或 Logstash 截断。建议精简定义:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
- 若对接 ELK,可改用 JSON 格式:
log_format json_log '{"@timestamp":"$time_iso8601","clientip":"$remote_addr","status":$status,"uri":"$request_uri"}'; - Nginx 会自动补 RFC 5424 头部(时间戳、hostname、tag),你定义的 format 仅作为消息体(MSG 部分)
- 避免使用可能为空的变量(如
$upstream_response_time),防止解析失败
服务端 rsyslog 配置要点
远端接收端需开启对应协议监听,并按 facility 路由日志:
- 启用 TCP 监听(rsyslog v8+):
module(load="imtcp")input(type="imtcp" port="601") - 创建路由规则,例如在
/etc/rsyslog.d/50-nginx.conf中添加:local7.* /var/log/nginx/remote-access.log - 确保端口开放且防火墙放行(TCP 601 或 UDP 514)
- 验证监听状态:
ss -tuln | grep :601


















