核心是源头控制日志记录:方法一关闭静态资源日志(access_log off);方法二分离至独立文件并精简字段;方法三用map+if条件记录;同时精确排除robots.txt、favicon.ico及健康检查路径。

要过滤掉无用的静态资源访问记录,核心不是事后“删日志”,而是从源头控制哪些请求该记、记到哪、记什么内容。重点在于按需分离或关闭日志,而不是用脚本去清洗已生成的大日志文件。
方法一:直接关闭静态资源日志记录
对.js、.css、.png等高频但低价值的请求,最简单高效的方式是彻底不记录:
- 在 server 块中添加专用 location,用 ~* 不区分大小写匹配常见后缀
- 配置 access_log off,明确禁用日志输出
- 确保该 location 写在 location / 或 proxy_pass 规则之前,避免被覆盖
示例配置:
location ~* \.(js|css|png|jpg|gif|ico|woff2?|ttf|eot|svg|webp)$ {
access_log off;
expires 1y;
add_header Cache-Control "public, immutable";
}方法二:将静态资源日志单独输出
如果仍需统计静态资源访问量(如做CDN回源分析或缓存命中率),应将其日志分离到独立文件:
- 用相同正则匹配静态后缀,但指定 access_log /var/log/nginx/static_access.log main
- 自定义轻量 log_format static,只保留 $remote_addr、$request、$status、$body_bytes_sent 等关键字段
- 主 access_log 保持不变,动态接口日志不受干扰
方法三:用 map + if 实现条件日志记录
适合已有统一日志格式、又想保留部分静态资源信息的场景:
- 在 http 块中用 map 判断 URI 是否为静态后缀,生成布尔变量(如 $is_static)
- 在 access_log 指令中使用 if=$is_static,仅当值为 0(非静态)时才写入
- 注意:必须显式指定 log_format 名称,不能省略
示例片段:
map $uri $is_static {
~*\.(js|css|png|jpg|gif)$ 1;
default 0;
}
server {
access_log /var/log/nginx/access.log main if=$is_static;
}顺带处理干扰项
有些请求虽带静态后缀,但不属于真实资源访问,建议单独排除:
- robots.txt 和 favicon.ico:用 location = /xxx 精确匹配,配 access_log off + log_not_found off
- 健康检查路径(如 /healthz):同样用前缀或精确 location 关闭日志
- 避免用 access_log /dev/null,它仍会触发磁盘 I/O,不如 off 彻底


















