Nginx error_log 不支持按错误内容过滤,应通过收紧日志级别(如设为error或crit)、关闭非关键404日志、按IP/条件动态屏蔽、关键路径单独隔离及定向丢弃(/dev/null)来精简日志。

Nginx 的 error_log 本身不支持按错误类型(比如“SSL handshake failed”或“connect() failed”)做内容级过滤,但可以通过控制日志产生源头来有效减少无用条目——核心是:不让它写,而不是写了再删。
提高日志级别,跳过低价值信息
非关键性提示(如配置重载成功、worker 进程重启、临时 upstream 不可用)大多落在 notice、info 或部分 warn 级别。这些对故障排查帮助小,却占日志大头。
- 生产环境推荐设为
error:只记录明确失败事件(502/504、权限拒绝、rewrite 语法错误等); - 若需更精简,可升至
crit:仅捕获阻断服务的致命问题(所有 upstream 全不可达、worker 崩溃前兆、TLS 严重校验失败); - 避免在
main或http块中配info/notice,否则全站都会被噪音污染。
关闭高频非关键 404 日志
/favicon.ico、/robots.txt、/apple-touch-icon.png 等请求返回 404 时,默认会记入 error.log,量大且无诊断价值。
在对应 location 中关闭:
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; }
location ~* \.(png|gif|jpg|jpeg|ico)$ { log_not_found off; }注意:log_not_found 只影响 404/410,不影响 5xx 错误;必须放在具体 location 块内才生效。
按 IP 或客户端条件动态屏蔽日志
某些恶意扫描 IP(如 192.168.100.55、203.0.113.88)持续触发无效请求,导致 error.log 被刷屏。可用 map + if 实现条件日志:
http {
map $remote_addr $disable_error_log {
default 0;
192.168.100.55 1;
203.0.113.88 1;
}
error_log /var/log/nginx/error.log error if=$disable_error_log;
}当 $disable_error_log 为 1 时,该请求的错误日志不写入;为 0 时正常记录。map 支持 CIDR 写法(如 192.168.1.0/24),也支持 $host、$http_user_agent 等变量匹配。
关键路径单独隔离,避免全局污染
不要把低级别日志配在顶层,而是聚焦真正重要的业务环节:
- 主配置保持
error_log /var/log/nginx/error.log error;作为基线; - 对
/api/v2/pay这类核心接口,单独加error_log /var/log/nginx/pay_crit.log crit;,只存致命错误; - 静态资源、健康检查等非关键路径,复用默认
error级别即可,不额外干预。
彻底丢弃某类日志:用 /dev/null
想完全不记录某段逻辑的错误?唯一可靠方式是定向丢弃:
location /healthz {
return 200 "ok";
error_log /dev/null crit; # 所有 crit 及以下错误直接吞掉
}⚠️ 切忌写 error_log off; —— 它会创建一个叫 “off” 的文件,反而持续写入并占用磁盘。
不复杂但容易忽略:真正有效的“过滤”,靠的是级别收紧、路径隔离、精准开关和条件屏蔽,而不是事后过滤。


















