可通过nginx的map指令配合access_log的if参数实现按user-agent条件记录日志:在http块定义$loggable映射,匹配特定ua设为0;在server或location中用access_log ... if=$loggable控制写入。

可以通过 Nginx 的 log_format 和 access_log 指令配合 map 指令,实现对特定 User-Agent 的请求不记录访问日志。
定义日志忽略规则(使用 map)
在 http 块中添加一个 map 变量,用于标记是否跳过日志:
map $http_user_agent $loggable {
default 1;
"~*healthcheck" 0;
"~*curl.*monitor" 0;
"~*UptimeRobot" 0;
"~*Checkmk" 0;
}说明:
– default 1 表示默认记录日志;
– 后续每行用正则匹配 UA 字符串,匹配成功则设为 0(即不记录);
– ~* 表示大小写不敏感的正则匹配;
– 注意:该 map 必须定义在 http 块顶层,不能放在 server 或 location 内。
配置条件化 access_log
在需要控制日志的 server 或 location 块中,将 access_log 指令与 $loggable 关联:
access_log /var/log/nginx/access.log main if=$loggable;
说明:
– main 是你已定义的日志格式名称(如未自定义,可用默认的 combined);
– if=$loggable 表示仅当变量值为非空且非 0 时才写入日志;
– Nginx 会自动跳过值为 0、空字符串或 "0" 的请求。
验证与调试建议
- 修改后执行
nginx -t确保语法正确 - 用
curl -A "healthcheck" http://your-domain/模拟请求,检查日志是否未新增 - 确认日志路径有写入权限,避免因权限问题导致日志“看似没记录”
- 若需忽略更多 UA,只需在
map中追加匹配行,无需重启 Nginx(重载即可)
补充说明:不推荐的做法
不要尝试用 if ($http_user_agent ~* healthcheck) { access_log off; } —— Nginx 不允许在 if 块中使用 access_log 指令,会导致配置加载失败。











