Nginx中排除特定文件访问日志的唯一有效方式是在server块内、location /之前用正则或精确匹配并配置access_log off;如location ~*.(js|css|png|...)$ { access_log off; }和location = /healthz { access_log off; },禁用if块或子location内设置,需nginx -t && nginx -s reload验证。
在 Nginx 的 location 配置中排除特定类型文件的访问日志,核心就一条:对匹配到的文件后缀,直接写 access_log off;。这不是“过滤”,而是彻底不写入——这是唯一真正生效的方式。
这是最常用也最稳妥的做法。把以下配置放在 server 块内、通用 location / 之前(顺序很重要):
location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|pdf|zip|webp|mp4|avi|mkv)$ { access_log off; }~* 表示大小写不敏感,能同时匹配 .JS 和 .js
|xml 就能排除 XML 文件location / 后面,会被父级日志继承覆盖像健康检查或机器人协议这类请求,没有扩展名,但同样没必要记日志:
location = /healthz { access_log off; return 200 "ok"; }location = /robots.txt { access_log off; log_not_found off; return 200 "User-agent: *nDisallow: /"; }location = /favicon.ico { access_log off; log_not_found off; try_files /favicon.ico =204; }= 精确匹配,性能高、无歧义,避免被其他正则规则误捕获很多配置看似合理,实际无效。关键点就几个:
if 块里写 access_log off —— Nginx 不支持log_format 或条件判断“筛掉”日志 —— access_log off 是唯一硬开关location / 里面当子块 —— 子 location 无法取消父级已启用的日志nginx -t && nginx -s reload,否则不生效最直接的办法:
curl 请求一个被排除的资源,比如 curl https://yoursite/logo.png
/var/log/nginx/access.log 末尾有没有新增记录/),确认日志仍在正常写入