Nginx日志过滤,屏蔽健康检查日志减少日志体积
服务器上部署的服务一旦接入负载均衡或容器平台,健康检查请求就会以固定频率打过来。
这些请求通常会命中 Nginx 并写入 access.log,日积月累会占用大量磁盘空间。
解决思路很简单:识别健康检查流量,并让 Nginx 跳过这部分日志记录。
本文用可复用的配置方法,帮你把健康检查日志从正常访问日志中剥离开,达到减少日志体积的目的。
先确认哪些请求是健康检查
在改配置之前,先搞明白健康检查请求长什么样。
登录服务器执行下面的命令,查看最近 100 条日志:
tail -n 100 /var/log/nginx/access.log
重点看 request_uri 和 user_agent。
常见的健康检查特征包括:
- 路径固定,如
/healthz、/health、/ping - UA 带有标识,如
kube-probe、kong、ALB或云厂商的探针名称 - 请求频率固定,比如每秒一次,且响应体很小
如果日志量太大不好观察,可以用 awk 统计 UA 出现次数:
awk '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
拿到有规律的 UA 或路径后,就可以开始过滤了。
用 map + if 参数控制日志开关
Nginx 从 1.7.0 版本开始,access_log 指令支持 if 参数,可以传入一个变量,变量值为 0 时不记录日志。
配合 map 模块,就能按 UA 或路径精准判断。
在 nginx.conf 的 http 块中加入如下配置:
http {
# 按 User-Agent 过滤
map $http_user_agent $loggable {
default 1;
~*healthcheck 0;
~*kube-probe 0;
~*ALB 0;
}
# 如果健康检查走固定路径,也可以按路径过滤
# map $request_uri $loggable {
# default 1;
# ~^/healthz 0;
# ~^/ping 0;
# }
}
然后在 server 块里,把原来的 access_log 加上 if=$loggable:
server {
access_log /var/log/nginx/access.log combined if=$loggable;
}
修改后先测试配置再重载:
nginx -t && systemctl reload nginx
这样带有 healthcheck 或 kube-probe 等特征的请求就不会写入 access.log 了。
针对特定路径单独关闭日志
健康检查如果只走固定路径,也可以用更直接的方式:在对应的 location 里关闭日志。
location = /healthz {
access_log off;
return 200;
}
这种方式适合精确路径,如果健康检查的路径很多,还是推荐用 map 统一管理。
注意:如果某个 location 没有配置 access_log,它会继承上一级(server 或 http)的设置;
所以关日志一定要写在你实际生效的 location 或 server 层级里。
避开几个容易踩的坑
- 不要用 if 指令设置 access_log off。比如
if ($request_uri ~ health) { access_log off; }在部分 Nginx 版本中不生效,因为if属于 rewrite 模块,执行顺序和日志模块不同。强烈建议用map+access_log if=。 - map 只能放在 http 块,不能放 server 或 location。如果你只有一个 server 想单独过滤,map 定义在 http 块,
access_log的地址可以放在 server 块。 - 正则要写准确。
~*表示忽略大小写,匹配尽量带上锚点,比如~^/health,避免把正常业务路径也误伤。 - 改完必须 nginx -t。配置格式错误会导致 Nginx 无法重载,所有请求都会中断。
- 日志轮转不受影响。过滤后日志变小,logrotate 的现有配置不用改,如果需要保留更长时间,反而可以调整保留周期。
验证日志是否真的变小
重载后的验证方法很简单,分三步走:
- 重载前先记录日志大小:
du -sh /var/log/nginx/access.log - 等待几分钟(确认健康检查请求已经产生),再执行
du -sh /var/log/nginx/access.log - 用
grep -c "healthcheck" /var/log/nginx/access.log看新日志中是否还有健康检查记录
如果你想实时观察,可以临时跑一个命令:
tail -f /var/log/nginx/access.log | grep healthcheck
正常情况下,重载后新增的日志里不再出现过滤条件对应的请求,日志文件增速也会明显放缓。
如果你正在处理 Nginx 日志过滤,屏蔽健康检查日志减少日志体积,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。