核心思路是提高日志级别、隔离路径、配合开关指令,从源头减少无关条目写入:生产环境推荐error级,可升至crit精简;用log_not_found off关闭非关键404日志;关键路径单独error_log隔离;/dev/null彻底屏蔽。

要让 Nginx 的 error_log 忽略非关键性错误信息,核心思路不是“过滤掉某类错误”,而是**通过提高日志级别、隔离日志路径、配合开关指令,从源头减少无关条目写入**。关键不在删,而在不记。
选对日志级别:跳过 notice/info/warn 中的噪音
非关键性错误(如配置重载成功、SSL 握手完成、worker 重启提示)大多落在 notice 和 info 级别,部分 warn 条目也属可恢复前兆(如 upstream 临时 down、client body 超限但已截断)。生产环境应避免使用这些级别:
- 全局或 server 块中禁用
info和notice—— 它们会记录大量运维过程日志,无故障诊断价值; - 日常运行推荐设为
error:只记明确失败事件(502/504、权限拒绝、rewrite 语法错); - 若需进一步精简,可升至
crit:仅捕获阻断服务的致命问题(worker 崩溃前兆、所有 upstream 全不可达、TLS 严重校验失败)。
关闭特定 404 日志:用 log_not_found 控制“不存在”类报错
像 /favicon.ico、/robots.txt 这类请求返回 404 时,默认会记入 error.log,数量大且无意义。可在对应 location 中关闭:
location = /favicon.ico { log_not_found off; access_log off; }location = /robots.txt { log_not_found off; }- 注意:
log_not_found只影响 404/410,不影响 5xx 错误;它必须放在具体 location 块内才生效。
定向隔离 + 关键路径聚焦:避免全局低级别污染
不要在 main 或 http 块里配低级别日志,否则整个实例都会被干扰。更稳妥的做法是:
- 主配置保持
error_log /var/log/nginx/error.log error;,稳住基线; - 对非核心接口(如静态资源、健康检查端点),不单独设
error_log,复用默认 error 级别即可; - 只在真正关键的业务路径(如
/api/v2/pay)内,用error_log /var/log/nginx/pay_crit.log crit;单独记录致命错误,物理隔离噪音。
彻底屏蔽某些日志输出:/dev/null 是唯一可靠方式
想完全不记录某类错误?Nginx 没有按错误类型过滤的机制,但可通过路径控制:
-
error_log /dev/null crit;—— 把日志丢进系统黑洞,真正关闭写入; - 切忌写
error_log off;—— 它会创建一个叫 “off” 的文件,反而占用磁盘并持续写入; - 该方式适合临时调试或明确不需要任何错误记录的测试 location。
不复杂但容易忽略:真正有效的“忽略”,靠的是级别收紧、路径隔离和精准开关,而不是事后 grep 或 logrotate 清理。











