核心是源头控制日志写入:静态资源请求通过location正则匹配并access_log off彻底禁用,动态业务请求才写入主access.log;logrotate仅负责后续归档,不参与过滤。

核心不是靠日志切割来“过滤”,而是从源头控制:静态资源请求压根不进主日志,动态业务请求才记录到主 access.log。切割只是后续归档手段,不能替代日志写入前的逻辑分离。
直接关闭静态资源日志(最常用)
在 server 块中添加专用 location,匹配常见静态后缀并禁用日志:
- 用 ~* 进行大小写不敏感正则匹配,覆盖 .js、.css、.png、.jpg、.woff2、.svg 等高频后缀
- 配置 access_log off,彻底跳过日志写入(比写入 /dev/null 更高效,不触发 I/O)
- 确保该 location 定义在
location /或proxy_pass规则之前,避免被覆盖
示例:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|woff2?|ttf|eot|svg|webp|pdf|zip|gz)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}排除干扰路径(robots.txt、favicon.ico、健康检查)
这些请求虽带静态特征,但不属于真实资源访问,应单独拦截:
- 用 location = /robots.txt 或 location = /favicon.ico 精确匹配,配
access_log off; log_not_found off; - 对健康检查路径如
/healthz或/ping,同样用前缀或精确 location 关闭日志 - 避免使用
if ($request_uri ~* ...)做判断,Nginx 不推荐在 if 中操作 access_log
为动态接口保留完整日志(主日志专注业务)
主 access_log 只由未被上述 location 拦截的请求写入,天然聚焦于动态业务:
- 保持默认或自定义的 log_format main(含 $remote_addr、$request、$status、$request_time 等关键字段)
- 主日志路径如
/var/log/nginx/access.log不需额外条件,只要没被前面 location 匹配,就自动记录 - 若需进一步限定,可在 server 块末尾加
access_log /var/log/nginx/access.log main if=$is_api;,配合 map 判断 URI 是否含 /api/、/v1/ 等特征
日志切割是辅助,不是过滤手段
logrotate 负责按时间或大小归档已生成的日志文件,不影响写入逻辑:
- 为
/var/log/nginx/access.log单独配置/etc/logrotate.d/nginx-main - 设置 daily、rotate 30、compress、missingok,避免磁盘撑爆
- 静态资源日志若另存为
static_access.log,也应配独立的 logrotate 文件,与主日志分开管理











