Nginx 的 error_log 指令支持 syslog:server=IP:PORT [level] 格式,但仅限目标地址和日志级别,不支持 proto、facility、tag 等参数;facility 固定为 local7,需配合 rsyslog 按此 facility 规则路由。

直接在 error_log 指令中使用 syslog: 前缀即可,但要注意它的语法限制比 access_log 少得多——不支持指定协议、facility、tag 或 severity 等参数,仅能设定目标地址和日志级别。
基本写法与限制
error_log 的 syslog 配置格式固定为:
error_log syslog:server=IP:PORT [level];- 例如:
error_log syslog:server=192.168.10.50:514 warn; - 省略
server=时,默认发往本地127.0.0.1:514(UDP) - 不支持
proto=tcp、facility=local7、tag=nginx_error等参数——这些在access_log中可用,但error_log不识别 - facility 固定为
local7,hostname 和 timestamp 由系统 syslog 协议栈自动添加
推荐搭配方案
因 error_log syslog: 功能受限,生产环境建议:
- 用
access_log syslog:...全功能推送访问日志(可设 TCP、facility、tag、自定义格式) - 对错误日志,保留本地文件方式:
error_log /var/log/nginx/error.log warn;,再由 rsyslog 主动读取该文件(imfile模块) - 或统一走
access_log+ 自定义 error 日志模块(如 OpenResty + Lua)捕获错误并打点到 syslog - 若坚持只用原生
error_log syslog:,请确保远端 rsyslog 按local7设施接收,并用$programname == 'nginx'或消息内容匹配过滤
服务端需同步配置 rsyslog
以 rsyslog v8+ 为例,在 /etc/rsyslog.d/99-nginx.conf 中启用监听并路由:
- 加载 TCP/UDP 模块:
module(load="imtcp") input(type="imtcp" port="514") - 接收后按 facility 分类:
if $syslogfacility-text == 'local7' then /var/log/nginx/error-syslog.log & stop - 重启生效:
systemctl restart rsyslog
验证要点
配置后务必检查:
- Nginx 配置语法:
nginx -t - 网络连通性:
nc -zv 192.168.10.50 514(TCP)或echo "test" | nc -u 192.168.10.50 514(UDP) - rsyslog 是否监听:
ss -tuln | grep :514 - Nginx error_log 本身是否报错(如
syslog: server unavailable)


















