在 nginx 里“过滤日志”通常有几种常见需求,不同场景做法不一样。下面按最常见用法给你系统说明。
一、按访问内容过滤(最常见)
1️⃣ 不记录某些请求(不发日志)
示例:不记录 favicon.ico、robots.txt
location = /favicon.ico {
access_log off;
return 204;
}
location = /robots.txt {
access_log off;
return 200 "User-agent: *\nDisallow: /\n";
}
✅ 适合:静态资源、健康检查、爬虫文件
2️⃣ 不记录静态文件(图片 / css / js)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
access_log off;
expires 30d;
}
二、按条件过滤(高级用法)
3️⃣ 不记录 404 请求
map $status $loggable {
404 0;
default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable;
✅ 适合:减少无效日志
4️⃣ 不记录健康检查请求(如 /health)
location /health {
access_log off;
return 200 "ok";
}
三、按 User-Agent / IP 过滤
5️⃣ 不记录某个 IP
map $remote_addr $loggable_ip {
"1.2.3.4" 0;
default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable_ip;
6️⃣ 不记录爬虫(User-Agent)
map $http_user_agent $loggable_ua {
~*bot 0;
~*spider 0;
default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable_ua;
四、按请求方法过滤(GET / POST)
7️⃣ 只记录 POST 请求
map $request_method $loggable_method {
POST 1;
default 0;
}
access_log /var/log/nginx/access.log combined if=$loggable_method;
五、日志文件本身过滤(不修改 nginx)
8️⃣ 查看日志时过滤(grep)
# 只看 500 错误
grep " 500 " /var/log/nginx/access.log
# 不看静态文件
grep -v "\.jpg\|\.css\|\.js" access.log
# 只看某个 IP
grep "1.2.3.4" access.log
六、推荐生产配置(示例)
http {
map $status $loggable {
404 0;
default 1;
}
access_log /var/log/nginx/access.log combined if=$loggable;
}
七、常见误区 ❌
❌ if 不能直接写在 location 里控制 access_log
✅ 要用 map + if=$var
你可以直接告诉我:
- 想过滤 什么?(IP / URL / 状态码 / 静态文件)
- nginx 版本(
nginx -v) - 是 access_log 还是 error_log
我可以给你精确配置。
