nginx日志分级通过error_log设错误级别(emerg至debug)、access_log配合map/if实现访问日志条件过滤,支持多作用域覆盖、格式精简与缓存优化,并需logrotate配合reopen完成轮转。

配置 Nginx 实现不同级别的日志处理,核心在于区分两类日志(访问日志和错误日志)并分别设置其输出路径、格式与详细程度。级别控制不是全局开关,而是通过 error_log 和 access_log 指令配合日志等级参数来实现,且支持按作用域(http/server/location)灵活覆盖。
错误日志级别:用 error_log 控制严重性
错误日志只支持 error_log 指令设置级别,语法为:error_log /path/to/error.log [level];
其中 level 可选值从高到低为:debug > info > notice > warn > error > crit > alert > emerg。级别越低,记录越详细;越低的级别会包含所有更高级别事件。
- 生产环境推荐 warn 或 error:避免日志泛滥,聚焦异常和潜在风险
- 排查问题时临时启用 info:能看到服务启停、重载、连接建立等常规运行事件
- 深度调试可用 debug:但需谨慎,尤其在高并发场景下可能迅速占满磁盘
- 可在不同作用域单独设置:例如 http 块设为
error,某个 server 块设为warn,该 server 的错误日志将按 warn 输出
访问日志级别:靠条件过滤 + 格式精简实现“逻辑分级”
不同于错误日志,access_log 指令本身不直接接受日志级别参数(如 info),但它支持 if=condition 条件过滤,可间接实现“按严重性记录”:
- 用
$status变量过滤特定响应码:比如只记录 4xx/5xx 错误请求access_log /var/log/nginx/error_access.log main if=$is_error;
配合 map 块定义:map $status $is_error { ~^[45] 1; default 0; } - 结合
log_format精简字段:定义轻量格式(如只保留 IP、时间、状态码、耗时),降低单条日志体积,相当于“信息密度降级” - 多个 location 可启用不同 access_log:静态资源 location 关闭日志(
access_log off),API 接口 location 启用完整格式,实现按路径分级记录
日志格式与缓存:影响性能和可读性
日志内容是否清晰、写入是否高效,取决于格式定义和缓存策略:
-
log_format必须在 http 块中定义,名称供access_log引用;常用变量如$remote_addr、$request_time、$upstream_response_time可反映真实链路耗时 -
access_log支持buffer=size和flush=time:例如buffer=64k flush=5s表示攒够 64KB 或 5 秒内强制刷盘,平衡 I/O 性能与日志实时性 -
open_log_file_cache可缓存日志文件句柄,减少频繁 open/close 开销,适用于日志文件较多或轮转频繁的场景
日志轮转与归档:保障长期可用性
Nginx 自身不提供自动轮转,需借助外部工具(如 logrotate)或脚本配合 nginx -s reopen 实现平滑切换:
- logrotate 配置中指定
postrotate nginx -s reopen,确保新日志写入新文件 - 避免直接
mv或rm日志文件——Nginx 仍持有旧文件句柄,会导致磁盘空间不释放 - 建议按天轮转 + 压缩归档(gzip),并保留最近 7–30 天,兼顾追溯能力与存储成本











