报错是这么冒出来的。为统计 AI 爬虫抓取量,我在 access.log 里用 grep 加 -i 去数 GPTBot,出来的条数总比 CDN 报表少,同一个小时差出三成。
中间走过弯路,把「主配置用 log_format 精简过字段,UA 根本没写进 access.log」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。GPTBot 的完整 UA 里带 +https://openai.com/gptbot 这段注释,只匹配名字会漏掉变体写法。还有一种是日志格式里 UA 字段被放在倒数第二列,grep 全行命中还会带上 Referer 里的同名串。
另外,边缘节点和源站的日志各存一份,只数源站等于漏掉缓存命中的请求。
动手时先看日志一行里到底有哪些字段
awk 'NR==1{print NF" "$0}' access.log
然后按独立的 UA 字段做精确匹配
awk -F'"' '$6 ~ /GPTBot/ {c++} END{print c}' access.log
和 CDN 后台的抓取报表对同一时段
awk -F'"' '$6 ~ /Bot/ {print substr($0,1,15)}' access.log | uniq -c | head
怎么算真的好了,看的是同一批现象。同一小时的统计条数与 CDN 报表差距收敛到百分之五以内,并且逐条抽查的 UA 都是完整的 GPTBot 字符串。
提醒一点。统计爬虫量之前先确认 log_format 里有没有 http_user_agent 字段,很多精简格式默认只留了请求行,后面所有分析都会偏。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。