Nginx 可直接通过 syslog 输出 error_log,需编译时启用 --with-syslog-support(主流包通常已支持),配置 error_log syslog:server=IP:PORT,facility=local7,tag=nginx_error;服务端 rsyslog 需加载 imudp/imtcp 模块并按 facility 和 tag 过滤写入文件。

可以将 Nginx 的 error_log 直接输出到 syslog,无需额外日志收集器(如 rsyslog 转发或 filebeat),前提是 Nginx 编译时启用了 --with-syslog-support(主流发行版预编译包通常已启用)。
确认 Nginx 是否支持 syslog
运行以下命令检查是否包含 syslog 模块支持:
nginx -V 2>&1 | grep -o with-syslog
若输出 with-syslog,说明支持;若无输出,需重新编译 Nginx 并添加 --with-syslog-support 参数。
配置 error_log 使用 syslog 协议
在 nginx.conf 的全局、http、server 或 location 块中,将 error_log 指令改为 syslog 格式:
error_log syslog:server=192.168.10.50:514,facility=local7,tag=nginx_error debug;
说明:
-
server=IP:PORT:指定 syslog 服务器地址和端口(默认 UDP 514,也可用 TCP:
tcp://192.168.10.50:514) -
facility=xxx:设置 syslog 设施值(如
local0–local7),便于服务端按来源分类 -
tag=xxx:添加标识前缀,方便在日志中过滤 Nginx 错误(如
nginx_error) -
日志级别(如
debug)仍有效,控制哪些级别消息发往 syslog
syslog 服务端接收配置(以 rsyslog 为例)
确保目标服务器(如 192.168.10.50)的 rsyslog 已启用 UDP/TCP 接收:
编辑 /etc/rsyslog.conf 或新建 /etc/rsyslog.d/20-nginx.conf:
# 启用 UDP 接收(推荐测试用)<br> module(load="imudp")<br> input(type="imudp" port="514")<br><br> # 启用 TCP 接收(更可靠,生产建议)<br> module(load="imtcp")<br> input(type="imtcp" port="514")<br><br> # 将 local7 设施且 tag 为 nginx_error 的日志写入独立文件<br> if $syslogfacility-text == 'local7' and $programname == 'nginx_error' then /var/log/nginx/error-syslog.log<br> & stop
重启 rsyslog:systemctl restart rsyslog,并确认防火墙放行 514 端口。
验证与排错要点
常见问题及检查方式:
-
Nginx 启动失败:检查 syslog 地址是否可访问(
nc -uvz 192.168.10.50 514),DNS 解析是否正常(建议用 IP) -
日志未到达:确认 rsyslog 配置语法正确(
rsyslogd -N1),并查看 rsyslog 自身日志(/var/log/messages)有无丢弃提示 - 日志内容不完整:Nginx 的 syslog 输出不包含请求行、headers 等信息,仅限 error_log 原生内容(如 “connect() failed”、“upstream timed out”);访问日志(access_log)需另配(不支持原生 syslog,需借助 log_format + pipe 或外部工具)
- 时间戳不准:确保 Nginx 服务器与 syslog 服务器时间同步(推荐部署 NTP)


















