nginx 1.7.0+ 原生支持 syslog,无需额外模块;需关闭本地日志、正确配置 syslog:server=... 参数及 facility/tag,并确保 rsyslog 服务端匹配监听与路由规则。

Nginx 本身不依赖外部模块来支持 syslog 日志输出——从 1.7.0 版本起,它已原生集成 syslog 协议能力。所谓“模块管理”在这里并不适用,无需编译安装 ngx_http_syslog_module 或其他第三方模块,也无需启用 --with-syslog 配置参数(该选项早已废弃)。你只需在配置中正确使用 syslog: 协议语法,并确保版本达标、网络与远端服务就绪。
确认 Nginx 版本并清理本地日志配置
Nginx 必须 ≥ 1.7.0(推荐 ≥ 1.7.1),运行以下命令验证:
nginx -v
若版本合规,需彻底禁用本地文件日志,避免冲突或双写:
- 注释或删除所有形如
access_log /var/log/nginx/access.log;的行 - 显式关闭:
access_log off; - 对于
error_log,1.11.6+ 才稳定支持完整 syslog 目标;低版本建议保留文件方式,或仅用简写error_log syslog:warn;(默认走 local7,无 tag 控制)
在 http/server/location 块中配置 syslog 输出
语法为 syslog:server=...,参数用逗号分隔,不能有空格,否则静默失效:
# 推荐 TCP(可靠)+ 自定义格式 + local7 分类 log_format syslog_fmt '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'; access_log syslog:server=tcp://192.168.10.50:601,facility=local7,tag=nginx_access,severity=info syslog_fmt; error_log syslog:server=192.168.10.50:514 warn;
说明:
-
server=支持 IP、域名;TCP 必须加tcp://前缀,端口可自定义(如 601) -
facility推荐用local0–local7,避开系统设施(如 daemon、auth) -
tag是日志标识(对应 syslog 报文中的PROGRAMNAME),Logstash 或 rsyslog 过滤时依赖它 -
severity控制发送级别:debug/info/warn/error/crit -
syslog_fmt需提前在http{}块中定义,避免使用嵌套引号或可能为空的变量(如$upstream_response_time)
远程 rsyslog 服务端需同步适配
Nginx 发送的是标准 RFC 5424 syslog 报文,接收端必须:
- 启用对应协议监听(UDP/TCP)
- 按
facility和tag路由到指定文件或转发目标
例如,在 /etc/rsyslog.d/99-nginx.conf 中添加:
module(load="imtcp") input(type="imtcp" port="601") if $syslogfacility-text == 'local7' and $programname == 'nginx_access' then /var/log/nginx/access-remote.log & stop
注意:
- 若用 TCP,rsyslog 端口需与 Nginx
server=中一致(如601) -
& stop防止日志被重复匹配写入其他规则
验证是否生效
三步检查缺一不可:
-
nginx -t检查语法,通过后nginx -s reload - 用
ss -tuln | grep :601确认 rsyslog 正在监听 TCP 端口 - 在远程服务器上临时抓包或
tail -f /var/log/nginx/access-remote.log查看实时写入
不复杂但容易忽略细节,重点是版本、协议一致性、facility/tag 匹配和本地日志关闭。











