Nginx日志过滤,屏蔽健康检查日志减少日志体积

服务器上部署的服务一旦接入负载均衡或容器平台,健康检查请求就会以固定频率打过来。
这些请求通常会命中 Nginx 并写入 access.log,日积月累会占用大量磁盘空间。
解决思路很简单:识别健康检查流量,并让 Nginx 跳过这部分日志记录。
本文用可复用的配置方法,帮你把健康检查日志从正常访问日志中剥离开,达到减少日志体积的目的。

先确认哪些请求是健康检查

在改配置之前,先搞明白健康检查请求长什么样。
登录服务器执行下面的命令,查看最近 100 条日志:

tail -n 100 /var/log/nginx/access.log

重点看 request_uriuser_agent
常见的健康检查特征包括:

  • 路径固定,如 /healthz/health/ping
  • UA 带有标识,如 kube-probekongALB 或云厂商的探针名称
  • 请求频率固定,比如每秒一次,且响应体很小

如果日志量太大不好观察,可以用 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.confhttp 块中加入如下配置:

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

这样带有 healthcheckkube-probe 等特征的请求就不会写入 access.log 了。

针对特定路径单独关闭日志

健康检查如果只走固定路径,也可以用更直接的方式:在对应的 location 里关闭日志。

location = /healthz {
    access_log off;
    return 200;
}

这种方式适合精确路径,如果健康检查的路径很多,还是推荐用 map 统一管理。

注意:如果某个 location 没有配置 access_log,它会继承上一级(server 或 http)的设置;
所以关日志一定要写在你实际生效的 location 或 server 层级里。

避开几个容易踩的坑

  1. 不要用 if 指令设置 access_log off。比如 if ($request_uri ~ health) { access_log off; } 在部分 Nginx 版本中不生效,因为 if 属于 rewrite 模块,执行顺序和日志模块不同。强烈建议用 map + access_log if=
  2. map 只能放在 http 块,不能放 server 或 location。如果你只有一个 server 想单独过滤,map 定义在 http 块,access_log 的地址可以放在 server 块。
  3. 正则要写准确~* 表示忽略大小写,匹配尽量带上锚点,比如 ~^/health,避免把正常业务路径也误伤。
  4. 改完必须 nginx -t。配置格式错误会导致 Nginx 无法重载,所有请求都会中断。
  5. 日志轮转不受影响。过滤后日志变小,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 日志过滤,屏蔽健康检查日志减少日志体积,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
MySQL最大连接数调优,根据服务器内存估算合理
下一篇
服务器内核panic崩溃,kdump配置
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意