从报错日志里读出真相:我的排查思路复盘
别跟我说你找不到日志
行,线上炸了,你跑来跟我说“日志里没信息”。我真是谢谢你了,你眼睛是不是长在后脑勺上?先别急着甩锅给运维,先问问自己:日志在哪儿你知道吗?
Docker 环境就 docker logs -f 你的容器名,别光盯着 stdout,stderr 也得看;K8s 环境 kubectl logs -f pod名,看完还不够就 kubectl describe pod 看 Events;物理机部署的话,先 find /var/log -name “你的应用*.log”,找不到就 ps aux | grep 你的进程,看 env 里配置的 LOG_PATH 是哪儿。
最离谱的是有人日志配置在 /home/app/logs/ 下,结果硬盘满了写不进去,他跑来问“我日志怎么是空的”。空你个头啊,空是因为写不进去,你 df -h 看一下磁盘占用行不行?别在这儿装无辜。
堆栈从下往上看,你懂吗?
好,日志找到了,打开一看满屏的 Exception 和 StackTrace。然后你从上往下读?行,你读吧,反正你读的全是废话。
异常堆栈要从下往上读!!!最底下那一行才是真正出问题的地方,上面那些 com.xxx.service.impl.UserServiceImpl 之类的都是调用链,说白了就是“经过哪儿”,不是“死在哪儿”。
举个例子:
java.lang.NullPointerException at com.xxx.service.impl.OrderService.createOrder(OrderService.java:45) at com.xxx.controller.OrderController.save(OrderController.java:88) at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-2)
你从 OrderController 入手查半天,那是入口,真正 NPE 的是 OrderService 第 45 行。这都不懂你就敢上生产调试?胆子比你工资还大。
时间戳前后三秒的上下文,比你那报错行值钱一万倍
找到关键报错行了吧?别关掉。往上看十行,往下看十行,看看报错前几秒应用在干嘛。
有些兄弟日志量太大,grep 直接搜 error,结果只看到那一行。实际上错误之前往往有 warning 写着“连接池快满了”,或者 info 写着“外部服务响应变慢”。你把前后三秒的日志拼起来看,根因自己就跳出来了,不是靠你脑补的。
再说个真实案例:有个接口每天固定时间报超时,日志里就一行 connect timeout。但我往前翻了五分钟,发现数据库连接数监控早就触顶了,每天那个时间点都有个跑批任务把连接占满。你光盯着超时那行能看出啥?看出你脑子是空的。
日志关键字搜索,你真的会用 grep 吗
我知道你们 grep 只用最基本的 grep “error” 然后管道 wc -l,就这点出息。
教你几招正经的:grep -E “error|fail|exception” 这叫正则多条件命中,别一条一条搜;grep -B5 “error” 往前看 5 行,grep -A5 “error” 往后看 5 行,这叫上下文捞取;tail -f 实时看,别傻站着等报错,先让它跑着,出问题了再 Ctrl+C 停,然后往上翻。
还有,zgrep 查压缩日志,journalctl -u 服务名 —since “1 hour ago” 看 systemd 日志,都比你在文件管理器里点点点强一百倍。
实战复盘:那个让我差点砸键盘的 null
跟你们讲个真事。有个接口间歇性 500,日志显示 NPE 在某个字段。我顺着堆栈找,发现是 JSON 序列化的时候对 null 做了个不安全的强转。一行行追,追到调用方,追到数据层,追了三小时。
结果你们猜根因是什么?调用方传了个空字符串 "" 而不是 null,字符串空不等于 null,但下游非要把它当 null 处理。这细节日志里写的是:param is empty,不是 null not allowed。我光顾着找 exception,没仔细看 info 级别的上下文。气得我差点把键盘扔出窗外。
所以我后来养成了习惯:先找 error,再往上找 info/warn,把整个链路串起来再看。别只盯着报错那一个点,那往往是症状,不是病因。
行了,别在我面前说日志没用了
今天把排查日志的基本功给你们过了一遍,下回线上炸了你再跟我说“日志里没线索”,我就让你自己对着屏幕跪着看。
找到日志,看堆栈从下往上,找上下文别只看一行,时间戳前后翻,用好 grep 别光会 wc -l。做到这几点,至少你能知道问题出在哪儿,而不是在那儿装无辜说找不到原因。
去练吧,蠢货们。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时






