什么,没打日志?这怎么排查问题?

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 代码throw Error导致的问题排除过程

最近发现一个监控服务一直没有采集到监控数据,最新的监控数据还是在项目切换为Spring Boot框架之前产生的。初步查看了一下日志竟然也没有发现任何异常信息,翻了翻代码发现数据收集的接口不论抛不抛出异常应该都会忠实的记录数据才对,问题很可能跟切换框架有关系,但是这个范围有点广啊导致排查陷入了停滞,程序员感受到了被程序支配的恐惧,但是问题还是得解决啊。

程序员遇到这种自相矛盾的问题一般有两种情况:

  • 一种是我X不对啊,应该执行这块代码怎么没执行?
  • 一种是我X不对啊,不应该执行这块代码怎么执行了?

第一种比第二种好解决一点,幸运的是这次遇到的是第一种情况。但是程序员在一边心想着手上开发的代码另一边哪TMD有心思查各种稀奇古怪的问题啊?关键还是TMD前人留下的代码!这时候可能思维就有些混乱像无头苍蝇一样寄希望于各种瞎猜战术,但是可想而知对于长这么大买饮料都是“谢谢惠顾”的我来说,这不太可能解决问题。

其实回过头想想排查问题最重要的手段还是日志(所以在写代码的时候写好日志比写好注释重要的多了),日志没有打印出来异常信息仔细想想有两种可能(排除掉太空辐射导致的幽灵情况),一种是确实没有执行,另一种是执行了但是由于种种原因日志框架没有输出出来。这时候猛然想起来一个细节:切换到Spring Boot之后System.out标准输出的日志没有打印出来,由于这种方式打印的日志通常无关紧要所以一直没有解决这个问题,那会不会异常信息产生到标准输出或标准错误中去了呢?程序是以nohup java -cp >/dev/null 2>&1 &这种方式启动的,标准输出和标准错误直接丢弃了,于是改成nohup java -cp >./sys.out 2>&1 &这种方式并查看sys.out内容终于发现了猫腻:程序抛出了Error!

到这里大家大概已经看出来问题了,程序仅仅捕获了Exception但是却抛出了Error,错误信息最终会输出到标准错误中去,而恰恰程序的启动方式把标准错误的信息丢弃了!

找到问题后解决方法就很简单了:

  • 一方面代码里catch住Error
  • 另一方面添加jul-over-slf4j依赖把标准输出和标准错误输出重定向到日志中去

复盘总结一下,两个因素交织在一起导致没能很快定位问题,这再次提示我打印日志很重要,日志问题要提早解决;同时遇到类似问题加个条件反射首先往Error这块想。然而更重要的是,遇到了自相矛盾的问题怎样能更快的梳理清楚思路,恐怕自己还需要更多的摸索。

参考

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
Dubbo Java 应用服务中间件
项目中引进这玩意,排查日志又快又准
随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候,因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。
|
运维 监控 安全
应急实战 | 记一次日志缺失的挖矿排查
应急实战 | 记一次日志缺失的挖矿排查
190 0
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
FeignClient打印请求失败的日志,打印所有feignCliet接口请求失败的错误日志,方便排查原因
237 0
|
28天前
|
Java Shell
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
36 1
|
28天前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
20 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
4月前
|
SQL Java Serverless
实时计算 Flink版操作报错合集之在写入SLS(Serverless Log Service)时出现报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
SQL Oracle 关系型数据库
oracle11g SAP测试机归档日志暴增排查(二)
oracle11g SAP测试机归档日志暴增排查(二)
312 1
|
6月前
|
Oracle 关系型数据库 Shell
oracle11g SAP测试机归档日志暴增排查(一)
oracle11g SAP测试机归档日志暴增排查(一)
76 1
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
3月前
|
JavaScript Serverless Linux
函数计算产品使用问题之遇到Node.js环境下的请求日志没有正常输出时,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。