Logger.error方法之打印错误异常的详细堆栈信息
一、问题场景
使用Logger.error方法时只能打印出异常类型,无法打印出详细的堆栈信息,使得定位问题变得困难和不方便。
二、先放出结论
Logger类下有多个不同的error方法,根据传入参数的个数及类型的不同,自动选择不同的重载方法。
当error(Object obj)只传入一个参数时会将异常对象作为Object使用,并最终当做String打印出来,当使用两个参数error(String message, Throwable t),且第二个参数为Throwable时,才会将完整的异常堆栈打印出来。
三、代码示例
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* @Author: LeeChao
* @Date: 2018/7/25
* @Describe:
* @Modified By:
*/
public class TestLogError {
public static final Logger LOGGER = LogManager.getLogger(TestLogError.class);
public static void main(String[] args) {
try{
// 模拟空指针异常
//Integer nullInt = Integer.valueOf(null);
int[] array = {1,2,3,4,5};
int outBoundInt = array[5];
}catch (Exception e){
// 直接打印,则只输出异常类型
LOGGER.error(e);
// 使用字符串拼接
LOGGER.error("使用 + 号连接直接输出 e : " + e);
LOGGER.error("使用 + 号连接直接输出 e.getMessage() : " + e.getMessage());
LOGGER.error("使用 + 号连接直接输出 e.toString() : " + e.toString());
// 使用逗号分隔,调用两个参数的error方法
LOGGER.error("使用 , 号 使第二个参数作为Throwable : ", e);
// 尝试使用分隔符,第二个参数为Throwable,会发现分隔符没有起作用,第二个参数的不同据,调用不同的重载方法
LOGGER.error("第二个参数为Throwable,使用分隔符打印 {} : ", e);
// 尝试使用分隔符,第二个参数为Object,会发现分隔符起作用了,根据第二个参数的不同类型,调用不同的重载方法
LOGGER.error("第二个参数为Object,使用分隔符打印 {} ",123);
}
}
}
信息输出:
四、查看源码中的方法描述
根据方法重载特性,当只输入一个参数时,此对象会被当做Object进行打印输出,如果是Exception e的话,这里直接就toString()。
* Logs a message object with the {@link Level#ERROR ERROR} level.
*
* @param message the message object to log.
*/
void error(Object message);
根据方法重载特性,当第二个参数为Throwable时,会打印出异常信息,并且包含异常堆栈信息。
* Logs a message at the {@link Level#ERROR ERROR} level including the stack trace of the {@link Throwable}
* <code>t</code> passed as parameter.
*
* @param message the message object to log.
* @param t the exception to log, including its stack trace.
*/
void error(String message, Throwable t);
根据方法重载特性,当第二个参数为Object时,会根据占位符进行替换并打印出错误日志。
* Logs a message with parameters at error level.
*
* @param message the message to log; the format depends on the message factory.
* @param p0 parameter to the message.
*/
void error(String message, Object p0);
五、结论
使用Logger.error(e)、Logger.error(e.getMessage())、Logger.error("some msg" + e)、Logger.error("some msg" + e.getMessage()) 都是调用的error(Object message),这个方法都会将入参当作Object输出,不会打印堆栈信息。
在使用Logger.error("first param ",e)时会调用error(String message, Throwable t),此方法会完整的打印出错误堆栈信息。
import lombok.extern.slf4j.Slf4j;
/**
* @Author: LeeChao
* @Date: 2018/7/25
* @Describe:
* @Modified By:
*/
@Slf4j
public class TestLogError {
public static void main(String[www.dasheng178.com] args) {
try{
// 模拟空指针异常
Integer nullInt = Integer.valueOf(null);
//int[] array = {1,2,3,4,5};
//int outBoundInt = array[5];
}catch (Exception e){
// 直接打印,则只输出异常类型
log.error(e.getMessage());
// 使用字符串拼接
log.error("使用 + 号连接直接输出 e : " + e);
log.error("使用 + 号连接直接输出 e.getMessage() : " + e.getMessage());
log.error("使用 + 号连接直接输出 e.toString() : " + e.toString());
// 使用逗号分隔,调用两个参数的error方法
log.error("使用 , 号 使第二个参数作为Throwable : ", e);
// 尝试使用分隔符,第二个参数为Throwable,会发现分隔符没有起作用,第二个参数的不同据,调用不同的重载方法
log.error("第二个参数为Throwable,使用分隔符打印 {} : ", e);
// 尝试使用分隔符,第二个参数为Object,会发现分隔符起作用了,根据第二个参数的不同类型,调用不同的重载方法
log.error("第二个参数为Object,使用分隔符打印 {} ","123");
log.error(e.getMessage(),e);
}
}
}
dominos-pe | 2019-03-19 18:45:43.282 | main | ERROR | c.d.www.meiwanyule.cn cloud.pe.utils.TestLogError.main(24) | null
dominos-pe | 2019-03-19 18:45:43.288 | main | ERROR | c.d.cloud.pe.utils.TestLogError.main(26) | 使用 + 号连接直接输出 e : java.lang.NumberFormatException: null
dominos-pe | 2019-03-19 18:45:43.288 | main | ERROR | c.d.cloud.pe.utils.TestLogError.main(27) | 使用 + 号连接直接输出 e.getMessage() : null
dominos-pe | 2019-03-19 18:45:43.288 | main | ERROR | c.d.cloud.pe.utils.TestLogError.main(28) | 使用 + 号连接直接输出 e.toString() : java.lang.NumberFormatException: null
dominos-pe | 2019-03-19 18:45:43.292 | main | ERROR | www.yongshi123.cn.d.cloud.pe.utils.TestLogError.main(30) | 使用 , 号 使第二个参数作为Throwable :
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.valueOf(Unknown Source)
at com.dominos.cloud.pe.utils.TestLogError.main(TestLogError.java:18)
dominos-pe | 2019-03-19 18:45:43.293 | main | ERROR | c.d.cloud.pe.utils.TestLogError.main(www.michenggw.com) | 第二个参数为Throwable,使用分隔符打印 {} :
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.valueOf(www.sanxinyuLevip.com Unknown Source)
at com.dominos.cloud.pe.utils.TestLogError.main(www.365soke.com TestLogError.java:18)
dominos-pe | 2019-03-19 18:45:43.293 | main | ERROR | c.d.cloud.pe.utils.TestLogError.main(34) | 第二个参数为Object,使用分隔符打印 123
dominos-pe | 2019-03-19 18:45:43.297 | main | ERROR | c.d.cloud.pe.utils.TestLogError.main(36) | null
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(www.xintiandiyule1.com Unknown Source)
at java.lang.Integer.valueOf(Unknown Source)
at com.dominos.cloud.pe.utils.TestLogError.main(TestLogError.www.suoLaieyuLe.com java:18)
Logger.error方法之打印错误异常的详细堆栈信息的更多相关文章
- log4j打印错误异常的详细堆栈信息
一.问题场景 使用Logger.error方法时只能打印出异常类型,无法打印出详细的堆栈信息,使得定位问题变得困难和不方便. 二.先放出结论 Logger类下有多个不同的error方法,根据传入参数的 ...
- 在程序异常中记录堆栈信息(使用ExWatcher)
在我们编写程序的时候可通过IDE自带的调试环境捕捉到异常(Except)错误,并能查看到相关的信息以便我们修正程序中的问题.但当软件被发布出去后,因为所部署运行的环境与我们的调试环境有很大区别,即使在 ...
- 打印Java异常堆栈信息
背景 在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来).这样方便后续定位问题. 需要记录的运行时环境包含两部分内容:抛异常时 ...
- java 异常体系详细介绍
一.异常概述与异常体系结构 异常:在Java语言中,将程序执行中发生的不正常情况称为"异常".(开发过程中的语法错误和逻辑错误不是异常). Java把异常当作对象来处理,并定义一个 ...
- Python中获取异常(Exception)信息
异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ...
- 【Java】 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、ArrayIndexOutOfBoundsException、ArrayStoreException、ArithmeticException等没有异常堆栈信息
今天工作中,临时Fix一个bug,一看日志“java.lang.ClassCastException: null”相当懵逼,没有详细堆栈信息,这咋整.虽然根据上下文可以推测代码的大致位置,但不敢拍板确 ...
- java的异常(Exception)信息的详细记录
下面的三个方法都是获取异常的详细信息,或许的异常详细信息以字符串的形式返回,保持栈堆载的风格 方法一: public static String getExceptionAllinformation( ...
- logger.error打印完整的错误堆栈信息
使用Spring Boot项目中的日志打印功能的时候,发现调用Logger.errror()方法的时候不能完全地打印出网站的错误堆栈信息,只能打印出这个错误是一个什么错误. 为什么呢,原因在于这个方法 ...
- 错误/异常:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/classes/beans_common.xml]...的解决方法
1.第一个这种类型的异常 1.1.异常信息:org.springframework.beans.factory.BeanCreationException: Error creating bean w ...
随机推荐
- iOS 传感器集锦
https://www.jianshu.com/p/5fc26af852b6 传感器集锦:指纹识别.运动传感器.加速计.环境光感.距离传感器.磁力计.陀螺仪 效果预览.gif 一.指纹识别 应用: ...
- 关于iframe页面里的重定向问题
最近公司做的一个功能,使用了iframe,父页面内嵌子页面,里面的坑还挺多的,上次其实就遇到过,只不过今天在此描述一下. 请允许我画个草图: 外层大圈是父级页面,里层是子级页面,我们是在父级引用子级页 ...
- 开发工具之Sublime编辑器
sublime是一款轻量级的编辑器,可以从官网上进行下载最新版本.它有很多使用并且强大的功能支持.例如:GOTO,package 等快捷操作.但有时候下载的版本不能进行安装package contro ...
- PostgreSQL 安装了contrib 之后 登录失败的问题
1. 自己之前只是安装了 pg 10.6 2. 开发同事 需要用到 一个extensions 叫做 uuid-ossp 3. 执行报错 详情见昨天的blog 4. 然后执行了升级操作 结果 pg10 ...
- MHA高可用及读写分离
一.MHA简介 二.工作流程 三.MHA架构图 四.MHA工具介绍 五.基于GTID的主从复制 六.部署MHA 七.配置VIP漂移 八.配置binlog-server 九.MySQL中间件Atlas
- python爬虫之scrapy文件下载
我们在写普通脚本的时候,从一个网站拿到一个文件的下载url,然后下载,直接将数据写入文件或者保存下来,但是这个需要我们自己一点一点的写出来,而且反复利用率并不高,为了不重复造轮子,scrapy提供很流 ...
- js splice vs slice
js splice vs slice https://stackoverflow.com/questions/37601282/javascript-array-splice-vs-slice htt ...
- django学习自修第一天【简介】
1. MVC框架 MVC框架的核心思想是解耦,降低各功能之间的耦合性,方便重构代码 (1)低耦合,高内聚 (2)高可扩展性 (3)向后兼容 2. MVT框架 V(视图):核心处理,接受请求,调用模型获 ...
- chrome版本下载
chrome 下载:https://www.chromedownloads.net/chrome64win/ chromedriver下载:http://chromedriver.storage.go ...
- flask 保存文件到 七牛云
上篇文章队长讲述了如何把前端上传的文件保存到本地项目目录 本篇 讲述一下把前端上传的文件保存到 第三方存储(七牛云) 七牛云相关步骤思路: 首先 进去七牛云官网,注册并实名认证来获取一个七牛云账号和存 ...