现场是这样的。为了省磁盘,把 log_format 精简成时间、状态码、字节数三个字段,一周后想统计蜘蛛抓了哪些栏目,发现日志里没有任何 URL,所有记录只能按首页处理,抓取预算根本算不出来。
中间走过弯路,把「多个 server 块共用一份格式,只改了其中一个」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。自定义格式覆盖了默认 combined,$request_uri 没写进去;日志被采集后原文件轮转删除,改配置也补不回历史数据;CDN 回源日志同样缺 URI,两边对不上号。
第一件事是看当前生效的格式里有哪些变量
nginx -T | grep -A3 'log_format'
然后把 URI、UA、耗时补回格式并 reload
log_format main '$remote_addr $request_uri $status $body_bytes_sent $http_user_agent $request_time';
reload 后抓一条真实请求确认字段
curl -s -o /dev/null https://www.example.com/seo/test && tail -1 /var/log/nginx/access.log
末了用
新
别只看报错消失,验证要多做一步。新格式上线后日志能直接按目录聚合,蜘蛛对正文页的抓取占比算出来是 38%,参数页占四成的问题随即暴露。
补一句。改日志格式先确认下游解析脚本的字段序号,多一个字段就会让整张报表错位,比缺字段更难查。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
