温馨提示×

nginx日志怎么过滤

小樊
37
2026-07-07 14:55:21
栏目: 编程语言

nginx 里“过滤日志”通常有几种常见需求,不同场景做法不一样。下面按最常见用法给你系统说明。


一、按访问内容过滤(最常见)

1️⃣ 不记录某些请求(不发日志)

示例:不记录 favicon.icorobots.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

我可以给你精确配置

0