错误日志应分层配置:全局设error级记录master异常,server块按需设warn或error,location内可进一步降级或定向debug,并通过io监控验证合理性。

配置 error_log 指令控制错误日志级别,核心不是“一刀切调低”,而是按作用域、按需、分层抑制无效输出,从而在保留关键线索的同时显著降低磁盘写入压力。
明确日志作用域,避免全局污染
Nginx 的 error_log 支持多级作用域(http / server / location),优先级由近及远。生产环境应严格分层:
- 全局(nginx.conf 最外层)只设
error级,专用于记录 master 进程异常(如端口占用、fork 失败),路径建议独立,如/var/log/nginx/global_error.log - http 块内不设
error_log—— 防止影响全部虚拟主机;真正需要增强日志的业务,仅在对应server块中显式声明 - 对非核心接口(如静态资源、健康检查路径),
location内可设为crit或更高,彻底屏蔽 warn/info 类低危事件
选对级别,拒绝无意义的“详细”
级别越低(如 debug),日志量呈指数增长;但级别过高(如 emerg)又会丢失定位依据。推荐组合:
- 主业务
server块用warn:覆盖upstream timed out、client sent too large body、rewrite or internal redirection cycle等高频可恢复警告,既不过载,也不漏关键线索 - 默认或边缘服务保持
error:只记真实失败,如open() "/xxx" failed (2: No such file)、connect() failed (111: Connection refused) -
info仅用于验证性操作:如 reload 后确认是否出现reconfiguring,验证完立即回退
临时调试不改全局,精准打点+隔离路径
排查时无需开放全站 debug,而是定向捕获:
- 在具体
location块内加独立error_log /var/log/nginx/debug_api.log debug;,仅该路径生效 - 配合
if限制 IP 或请求头:if ($http_x_debug = "1") { error_log /var/log/nginx/debug_trace.log debug; }(注意:仅限 location 内使用) - debug 日志必须写入独立磁盘分区(如
/mnt/ssd/),并设置logrotate的copytruncate模式,避免重命名阻塞写入
联动系统指标,让日志策略可验证
日志级别是否合理,不能只看配置,要看实际 IO 表现:
- 开启
warn后运行iostat -x 1,观察%util是否持续高于 80%;超标则说明日志已成瓶颈,需收缩范围或降级 - 监控
df -h /var/log和单日增量:warn级下核心业务日志应 ≤50MB;若超限,检查是否误启了http块顶层error_log - 执行
nginx -t耗时明显变长?可能是 debug 日志干扰 fork 性能,需检查是否残留未注释的 debug 配置
不复杂但容易忽略:精简日志不是删信息,而是让每一条落盘的日志都带着明确意图和上下文价值。











