用户反馈某笔任务失败,6 台 worker 上按时间 grep 出 4000 多行,没有一行能确认属于这个 task_id,排查花了 3 小时。日志里能对上时间点,这种反而好排。
日志格式里只有时间和消息,任务 id 存在上下文里但没有打进日志。多进程并发写同一个文件,行与行之间也交错。这一点先确认清楚,后面就不用反复试。
grep 'task_id=2f1c9a' /var/log/app/*.log zgrep -h 'task_id=2f1c9a' /var/log/app/*.gz
围绕「任务日志追踪」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。
处理上按这个顺序:在日志格式里加 task_id 和 worker 名两个字段 用 filter 自动注入;任务入口和出口各打一条带状态的日志;日志按天切分并集中到一处 用 task_id 检索;出问题时先按 task_id 拉全链路 再看耗时断点。
结果对不对很好判断,随便挑一个 task_id 能在一条命令里取到该任务的完整日志 行数在 5 行以内。
