nginx过滤静态资源日志应优先采用location精准匹配+access_log off,其次用map+if条件记录,再辅以精确匹配排除robots.txt等伪静态路径,并可选分离轻量静态日志。

直接在 Nginx 配置中过滤特定静态资源的日志,关键不是靠额外模块,而是用好原生支持的 access_log off、map + if= 条件记录,以及精准的 location 匹配。Nginx 官方不推荐事后清洗日志,而强调“源头控制”——哪些请求该记、记到哪、记什么字段。
用 location 精准匹配并关闭日志
这是最简单高效的方式,适用于高频但无分析价值的静态资源(如 .js、.css、.png、.ico):
- 在
server块内靠前位置添加专用location,确保它优先于location /或proxy_pass - 使用
~*大小写不敏感正则匹配后缀,例如:location ~* \.(js|css|png|jpg|gif|ico|woff2|ttf|eot|svg|webp)$ - 明确配置
access_log off;,彻底跳过日志写入(比写入/dev/null更省 I/O) - 可同步设置缓存头提升性能:
expires 1y;和add_header Cache-Control "public, immutable";
用 map + if 实现条件日志记录
适合已有统一日志格式、又想保留动态接口完整日志,仅排除部分静态路径的场景:
- 在
http块中定义映射变量,例如判断 URI 是否为静态后缀:
~*\.(js|css|png|jpg|gif)$ 1;
default 0;
}
- 在
server或location中启用条件日志:access_log /var/log/nginx/access.log main if=$is_static; - 注意:必须显式指定
log_format名称(如main),不能省略;且if=$is_static表示值为0时才记录
单独排除干扰型“伪静态”请求
robots.txt、favicon.ico、健康检查路径(如 /healthz)虽带静态后缀,但不属于真实资源访问,应显式跳过:
- 用
location =精确匹配,避免正则开销:location = /robots.txt { access_log off; log_not_found off; return 200 "User-agent: *\nDisallow: /\n"; } - 同理处理
/favicon.ico:return 204;并关闭日志与 404 记录 - 对探针路径如
/ping、/health,也用location =或location ^~ /health关闭日志
分离静态日志并精简字段(可选)
如果仍需统计静态资源访问量(如 CDN 回源分析),建议独立输出、轻量记录:
- 自定义轻量日志格式,只保留必要字段:
log_format static '$remote_addr [$time_local] "$request" $status $body_bytes_sent "$http_referer"'; - 在静态
location中指定:access_log /var/log/nginx/static_access.log static; - 搭配
logrotate按日轮转、保留 30 天,防止磁盘占满











