一台机器上挂了 www 和 m 两个站点,log_format 里只写了 $request,没带 $host。月底统计蜘蛛抓取量是 18 万,但两个站后台加起来只有 9 万,对不上。

原因不止一个,得分开看。两个 server 块共用同一份 access.log,请求混在一条流里;m 站的静态资源和 www 的路径同名,按路径也分不开;日志里没有 server_name 字段,只能靠 referer 猜,猜不准;统计脚本按行数算抓取量,把两个站的 200 和 304 都算了进去。

先改 log_format 补上 host 与状态字段

log_format main '$host $remote_addr [$time_local] "$request" $status $body_bytes_sent';

随后按 host 分组统计当天的蜘蛛请求

awk '$0 ~ /Baiduspider/ {print $1}' access.log | sort | uniq -c

给两个 server 块分别指定独立日志文件

access_log /var/log/nginx/m.access.log main;

等前面都确认过,再用新日志重跑一天的报表做校验

python stat.py --log /var/log/nginx/www.access.log --date 2026-11-14

恢复的判定其实很直接。两个站点的抓取量之和与日志行数完全相等,报表里 host 维度能正常展开,后台抓取统计的误差从一倍缩到 2% 以内。

提醒一点。历史上已经在用的日志没法补字段,只能从现在开始分文件,旧数据要拆就得按 IP 与路径规则重新归类,别硬算。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189