你真的会正确打印异常堆栈信息吗?

目录

前言

一、如何正确地打印异常的堆栈信息?

 二、log.info和log.error的区别

三、 总结


前言

最近在修改项目里所有和log有关的代码,之前也用过log4j、slf4j或者Logback等日志框架/接口,一直以为打印异常信息就是简单地一句log.info()或者log.error()而已,没想到原来一直都使用错了,以至于有些错误信息没能在log文件中打印出堆栈信息,最终难以定位bug,排查困难。

一、如何正确地打印异常的堆栈信息?

一般在catch到异常的时候,不要使用e.printStackTrace()来打印异常信息。我们使用日志框架来打印信息,一般来说,日志框架的log级别从低到高是:debug, info, warn, error, fatal

对于异常,一般使用log.error()来打印堆栈信息。下边的三个log语句都打印了异常,但是写法却不一样,打印出来的效果也是不同的:

log.error("ERROR", "Error found: ", e);
log.error("ERROR", "Error found: " + e.getMessage());
log.error("ERROR", "Error found: " + e);

注意:千万别用e.getMessage()打印错误信息,因为e.getMessage()的打印是属于不合理的,message给的信息有的情况并不理想

例子:

try {
     System.out.println(1/0);
} catch (final Exception e) {
    log.error("ERROR", "Error found: ", e);
    log.error("ERROR", "Error found: " + e.getMessage());
    log.error("ERROR", "Error found: " + e);
}

控制台输出:

2023-01-06 11:46:34,834 main ERROR com.zj.test.TestZheng- Message: ERROR; Description: Error found: java.lang.ArithmeticException: / by zero at com.zj.test.TestZheng.main(TestZheng.java:46)

2023-01-06 11:46:34,837 main ERROR com.zj.test.TestZheng- Message: ERROR; Description: Error found: / by zero

2023-01-06 11:46:34,838 main ERROR com.zj.test.TestZheng- Message: ERROR; Description: Error found: java.lang.ArithmeticException: / by zero

1、对于第一个log语句,可以看到堆栈信息被打印了出来。

2、对于第二个log语句,只是打印出了异常的具体信息,既没有异常类名,也没有堆栈信息。

3、对于第三个log语句,打印出了异常的类名和具体信息,但是没有打印出来堆栈信息。

 二、log.info和log.error的区别

log.info是打印的普通的日志,一般以流程中转为主

log.error是打印异常信息的, 用error要打印完整异常栈, 这样的话, 追踪错误比较方便 

三、 总结

应该使用第一种log语句的形式来将堆栈信息打印出来,方便日后定位bug,排除错误。

今天就分享到这里! 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值