nginx中过滤静态资源日志的核心方法有三种:一是用location正则匹配后缀并access_log off;二是为静态资源单独定义log_format和access_log路径;三是用map模块根据uri等条件动态控制日志开关。

在 Nginx 中实现静态资源访问日志过滤,核心是通过 log_format 和 access_log 的条件控制,避免将图片、CSS、JS 等高频但低价值的请求写入主访问日志,从而降低磁盘 I/O、节省存储,并提升日志分析效率。
使用 if 判断 + access_log off 过滤静态资源
这是最常用且轻量的方式:在 location 块中匹配常见静态后缀,直接关闭该路径的日志记录。
- 在 server 或 http 块中定义静态资源 location:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|eot|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off; # 关键:不记录日志
}-
~*表示忽略大小写的正则匹配 -
access_log off会跳过该 location 的所有请求日志,包括默认日志和自定义日志 - 注意:不能在 if 块中使用
access_log off(Nginx 不支持)
按日志格式区分:为静态资源单独定义 log_format
若需保留静态资源日志但便于后续筛选或归档,可为其配置独立日志文件与精简格式。
- 先定义一个极简日志格式(仅含时间、URI、状态码):
log_format static '$time_iso8601 $request_uri $status';
- 再在对应 location 中指定该格式与文件路径:
location ~* \.(css|js|png|jpg)$ {
access_log /var/log/nginx/static.log static;
# 其他静态配置...
}- 这样静态日志与业务日志分离,可用 logrotate 单独管理,或用 grep/awk 快速提取
- 避免污染主日志,也方便做 CDN 回源分析或缓存命中率统计
利用 map 模块实现更灵活的条件日志控制
当静态资源路径不完全依赖后缀(如 /assets/v1.2.3/xxx.js),或需结合 URI 路径、查询参数判断时,map 更健壮。
- 在 http 块中定义映射变量:
map $uri $loggable {
~*\.(jpg|jpeg|png|gif|css|js|woff2?)$ 0;
~*/api/.* 1;
~*/admin/.* 1;
default 1;
}- 然后在 server 中按变量值开关日志:
access_log /var/log/nginx/access.log main if=$loggable;
-
if=$loggable表示仅当 $loggable 值为非空且非 0 时才记录日志 - 这种方式可组合多个条件(如排除特定路径 + 特定后缀 + 非调试环境),扩展性强
注意事项与常见陷阱
实际配置中容易踩坑,需特别留意:
- location 匹配顺序很重要:正则 location 优先级低于精确匹配(=)和前缀匹配(^~),确保静态规则不被更宽泛的 catch-all location 覆盖
- 避免在 root 或 alias 路径外误配静态 location —— 若文件实际不存在,Nginx 会返回 404,但仍会触发
access_log off,导致丢失错误排查线索 - 开启
log_not_found off可进一步减少 404 日志干扰(配合静态 location 使用) - 重启前务必
nginx -t校验语法,尤其是 map 和正则表达式中的转义











