先别急着改代码或删页面。更稳妥的做法是:把两边日志里同一个请求的“事件”用可验证的字段对齐,而不是用时间戳直接相减。因为抓取日志通常记录的是服务器或边缘节点收到请求的瞬间,应用日志记录的可能是请求进入业务逻辑、查询数据库或写缓冲区的瞬间;两者之间隔着队列、连接池、重试和异步写入,时间不一致本身不说明谁对谁错。你要做的是把分歧转成可核对的项目:同一个URL、同一个User-Agent、同一个响应状态、同一个响应字节数,先确认是不是同一次访问。
假设你手上有两份日志:一份是Nginx或负载均衡的访问日志,一份是应用框架的请求日志。两边都出现了一个URL,但时间相差几秒到几分钟。这时不要直接判断应用日志延迟,先看四个字段能否对上:请求方法、完整路径(含查询串)、User-Agent、响应状态码。如果路径相同但查询串不同,可能是两次不同抓取;如果User-Agent相同但状态码一个200一个404,那更可能是中间有重定向或缓存层介入。
一个可执行动作是:从抓取日志里挑出目标URL,记录它的精确时间、客户端IP、User-Agent、状态码和响应字节数;再到应用日志里搜同一个路径,看同一秒或相邻几秒内是否有匹配记录。如果响应字节数也能对上,基本可以确认是同一次访问;如果对不上,先把它当作两次独立事件,不要强行合并。
确认是同一次访问后,时间差可以拆成三段来核对:网络与排队段、应用处理段、日志写入段。网络与排队段包括请求从客户端到服务器、经过负载均衡和反向代理的时间;应用处理段包括框架路由、中间件、业务逻辑和数据库查询;日志写入段包括应用把日志写到本地文件、标准输出或远程日志服务的时间。你不需要精确测量每一段,但可以用两个动作缩小范围。
如果应用日志的进入时间比抓取日志晚很多,但离开时间与抓取日志的响应时间接近,说明延迟主要发生在请求进入应用之前,可能是队列或连接池等待;如果进入时间接近、离开时间差很多,说明延迟在应用处理或日志写入阶段。这个判断会影响下一步:前者优先查代理和连接池配置,后者优先查慢查询和日志异步队列。
如果两份日志都支持自定义字段,最省事的做法是让应用生成一个请求ID,并把它返回在响应头里,同时写进应用日志。抓取日志如果记录了响应头,就能用这个ID反查;如果抓取日志不记录响应头,至少可以在应用日志里用“路径+User-Agent+状态码+秒级时间”做组合键。组合键不保证唯一,但比单独用时间戳可靠。
状态码也要纳入对齐规则。假设抓取日志显示200,应用日志显示499或502,这通常不是同一次访问,而是中间层返回了错误页或连接被中断。反过来,抓取日志显示301,应用日志显示200,可能是应用内部做了重定向,而抓取日志记录的是重定向前的响应。把状态码不一致的配对单独列出来,不要混进时间差统计里。
假设某页面在抓取日志里显示上午10:00:03被访问,状态码200;应用日志里同一路径出现在10:00:09,状态码200,响应字节数相同。两边时间差6秒。你先用路径和字节数确认是同一次访问,然后看应用日志里是否有请求进入和离开两个时间点。如果进入时间是10:00:08、离开时间是10:00:09,说明请求在进入应用前等了约5秒;如果进入时间是10:00:03、离开时间是10:00:09,说明应用处理花了6秒。前者下一步去查反向代理的队列和连接池,后者去查该请求对应的数据库查询或外部调用。这个例子里的数字只用于说明比较方法,不代表任何真实系统的表现。
百度索引量是结果指标,抓取日志和应用日志是过程记录。如果两边时间对不上,你无法判断某次抓取是否被应用正常处理,也就无法把索引量变化归因到抓取失败、内容变更或质量判断。对齐事件之后,你可以按URL分组,看同一批URL在抓取日志里是否持续返回200、在应用日志里是否持续完成处理。如果抓取日志有请求但应用日志没有对应记录,先怀疑中间层缓存或代理直接返回;如果应用日志有记录但抓取日志没有,先怀疑抓取日志采样或写入延迟。只有排除了这些解释,才值得进一步讨论索引量本身的变化。
最后提醒一点:robots.txt限制抓取不等于可靠的索引移除,站点地图不保证收录,HTTPS也不保证排名。这些条件在你对齐日志之后仍然成立,不要因为某次抓取正常就跳过对页面状态和内容质量的核对。