报错是这么冒出来的。为了压日志体积,在 server 段里用 if 把静态资源的日志关掉,改动后发现蜘蛛抓取 HTML 的记录也一起消失,日志里只剩少量图片请求。

中间走过弯路,把「日志路径指向的目录没有写权限,写入失败被静默忽略」当成主因,改完现象没变。

这类报错背后常见的原因有几处,逐个排除就行。if 在 location 之外的行为不可预期,日志指令被整体跳过。也可能是access_log off 写在更高层级,子层的设置没有覆盖回来。

不容易想到的是,日志被发到了 syslog,本地文件自然为空。

先确认当前配置里的日志指令层级

nginx -T | grep -n 'access_log'

然后看错误日志有没有写入失败提示

tail -50 /var/log/nginx/error.log

再往下把条件记录换成 map 方式

map $request_uri $loggable { default 1; ~*\.(css|js|png)$ 0; }
access_log /var/log/nginx/access.log main if=$loggable;

等前面都确认过,再重载后验证日志是否恢复

nginx -t && nginx -s reload && tail -5 /var/log/nginx/access.log

别只看报错消失,验证要多做一步。日志文件重新出现 HTML 请求记录,蜘蛛抓取量与 CDN 侧统计对得上,日志体积只下降了两成。

提醒一点。条件日志要用 map 加 if= 参数,写在 if 块里的 access_log 在多数版本里都不按预期工作。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189