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 ...
随机推荐
- Python里面如何拷贝一个对象
1.赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个. In [168]: a Out[168]: [1, 2, 3] In [169]: b=a In [170]: a ...
- 利用tushare进行对兴业银行股价的爬取,并使用numpy进行分析
import sysimport tushare as tsimport numpy as npdata=ts.get_h_data('601066')print(data)#读出兴业银行7列数据da ...
- NSAssert和NSParameterAssert
2016.05.05 18:34* 字数 861 阅读 5127评论 0喜欢 17 https://www.jianshu.com/p/3072e174554f NSAssert和NSParamete ...
- 蒲公英App开发之检测新版本
https://www.jianshu.com/p/2d3f048511d7 2017.04.17 16:22* 字数 62 阅读 422评论 0喜欢 1 可以在App内部实现检测版本更新并实现安装. ...
- 【转】Linux下cp: omitting directory `XXX'问题解决
在linux系统中复制文件夹时提示如下: Shell代码 [root@idtp4 site-packages]# /site-packages/ cp: omitting directory ‘yag ...
- 哈尔滨工程大学ACM预热赛
https://ac.nowcoder.com/acm/contest/554#question A #include <bits/stdc++.h> using namespace st ...
- 图片转字符画 【学习ing】
1.创建ascii.py 2. 下面是 ascii.py 的完整代码: from PIL import Image import argparse #命令行输入参数处理 parser = argpar ...
- 便捷的ajax请求
为什么要做这个呢?如果后端给的数据不单有JSON字符串,还有对象呢?这个时候我们就要每个都处理(JSON.parse).万一后端又改了,所有都是对象呢?如此一来我们就需要对我们的ajax进行封装. 这 ...
- java 代理模式(静态代理、动态代理、Cglib代理) 转载
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- Linux基础学习笔记5-软件管理
包管理器 二进制应用程序的组成部分: 二进制文件.库文件.配置文件.帮助文件 程序包管理器: debian:deb文件.dpkg包管理器 redhat:rpm文件.rpm包管理器 rpm:Redhat ...