nginx error_log规范核心是统一路径、分级控制、语义命名、安全过滤——所有日志须置于/var/log/nginx/下,按模块命名如api-gateway.error.log,权限640,main块设error级,业务server设warn级,禁用debug/info,对接syslog或logrotate+敏感词扫描。

团队开发中规范 Nginx error_log,核心是统一位置、分级控制、语义清晰、安全可控——不是堆参数,而是让日志在出问题时能快速定位“谁、在哪、为什么”。
统一路径与权限管理
所有服务的 error_log 必须指向同一基目录,推荐 /var/log/nginx/,禁止使用相对路径(如 logs/error.log)或混用绝对路径。每个站点或模块的日志应语义化命名,例如:
-
api-gateway.error.log(对应 API 网关 server 块) -
auth-service.error.log(对应鉴权 upstream 模块) -
global.error.log(main 块全局兜底日志)
文件权限设为 640,属主固定为 nginx:adm,确保运维可读、普通用户不可访问;logrotate 配置需同步覆盖全部日志文件,启用压缩与保留周期(如 7 天归档)。
按角色分层设置日志级别
不搞“一刀切”,而是依据模块职责设定 error_log 级别:
- main 块设
error_log /var/log/nginx/global.error.log error;:捕获 worker 异常退出、配置加载失败等基础故障 - 核心业务 server(如支付、登录)设
error_log /var/log/nginx/api-gateway.error.log warn;:记录证书过期、upstream refused、重定向循环等高价值预警 - 静态资源或健康检查 location 可关闭或设
error_log off;或error_log ... error;:过滤 404、favicon.ico 缺失等低价值条目
避免在任何生产配置中出现 debug 或 info,除非临时诊断且已确认编译含 --with-debug 并限定输出路径。
标准化日志格式与上下文注入
默认 error_log 不支持自定义格式,但可通过以下方式增强可读性:
- 在关键 server 或 upstream 块中,配合
log_format+access_log补充结构化上下文(如请求 ID、trace_id),便于错误与访问链路对齐 - 在模块开发中调用
ngx_log_error()时,强制传入r->connection->log或cf->log,并带上$request_id或$upstream_addr等变量,例如:
ngx_log_error(NGX_LOG_WARN, r->connection->log, 0, "auth header missing for request %V", &r->headers_in.request_id); - 禁用未脱敏的
$request_body记录,调试需临时开启时必须加白名单 IP 限制与日志截断(如只取前 256 字节)
集中采集与敏感信息过滤
error_log 输出目标应对接统一日志平台:
- 优先使用
error_log syslog:server=unix:/dev/log notice;,由 journald 或 rsyslog 统一转发,避免本地磁盘写满 - 若直写文件,需在 logrotate 后增加 postrotate 脚本,自动扫描新归档文件中是否含手机号、token、身份证片段等关键词,发现即告警并隔离
- 禁止在 error_log 中记录
SSL certificate verify failed类原始报错中的完整域名或私钥路径,应重写为泛化提示(如 “TLS handshake failed for upstream [masked]”)











