先看现象。自己写的统计脚本突然报出两千多个 499,实际服务器上一条 499 都没有。脚本用 awk 取第九列当状态码,可日志里 referer 含空格,整行列数被撑开,后面全串位了。
排查方向其实有限,先把可能性排一排。referer 或 UA 里带空格,按空白切分后字段整体后移。少数情况下是日志格式改过一版,脚本里的列号没有跟着改。
另外,部分记录某个字段是横杠,按位置硬取就串位。
少数情况下是日志里混进了 JSON 格式的错误行,字段结构完全不同。
上来先看前几行的字段数分布
awk '{print NF}' access.log | sort | uniq -c | sort -rn | head
再往下改用引号切分再取状态码
awk -F'"' '{split($3,a," "); print a[1]}' access.log | sort | uniq -c
只取字段数固定的行做统计
awk 'NF==12 {print $9}' access.log | sort | uniq -c | sort -rn | head
剩下的就是统
一
改完先别撤,确认这几项。换成按引号切分后 499 的数量回到真实的两条,抓取统计和 GSC 的差距从三成缩到 5% 以内。
补一句。日志分析脚本比日志格式更脆弱,格式一改就要回头改列号,不然算出来的数字全是假的。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
