Logger.error打印错误异常的详细堆栈信息

 更新时间:2020年02月19日 10:51:24   作者:翎野  
这篇文章主要介绍了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;
 
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),此方法会完整的打印出错误堆栈信息。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java 数据结构链表操作实现代码

    Java 数据结构链表操作实现代码

    这篇文章主要介绍了Java 数据结构链表操作的相关资料,并附实例代码,需要的朋友可以参考下
    2016-10-10
  • Java如果通过jdbc操作连接oracle数据库

    Java如果通过jdbc操作连接oracle数据库

    这篇文章主要介绍了Java如果通过jdbc操作连接oracle数据库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 老生常谈Java反射机制(必看篇)

    老生常谈Java反射机制(必看篇)

    下面小编就为大家带来一篇老生常谈Java反射机制(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java中isAssignableFrom的用法详解

    Java中isAssignableFrom的用法详解

    下面小编就为大家带来一篇Java中isAssignableFrom的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • JAVA实现深拷贝的几种方式代码

    JAVA实现深拷贝的几种方式代码

    这篇文章主要给大家介绍了关于JAVA实现深拷贝的几种方式,在Java中深拷贝和浅拷贝是用来复制对象的两种不同方式,深拷贝会对所有数据类型进行拷贝,包括对象所包含的内部对象,需要的朋友可以参考下
    2023-09-09
  • Mybatis-Plus批量添加或修改数据的3种方式总结

    Mybatis-Plus批量添加或修改数据的3种方式总结

    使用Mybatis-plus可以很方便的实现批量新增和批量修改,不仅比自己写foreach遍历方便很多,而且性能也更加优秀,下面这篇文章主要给大家介绍了关于Mybatis-Plus批量添加或修改数据的3种方式,需要的朋友可以参考下
    2023-05-05
  • java jpa如何自定义sql语句

    java jpa如何自定义sql语句

    这篇文章主要介绍了java jpa如何自定义sql语句方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Boot动态加载Jar包与动态配置实现

    Spring Boot动态加载Jar包与动态配置实现

    随着项目的不断演进和业务需求的增长,很多场景下需要实现系统的动态性和灵活性,本文主要介绍了Spring Boot动态加载Jar包与动态配置实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Java远程连接Linux服务器并执行命令及上传文件功能

    Java远程连接Linux服务器并执行命令及上传文件功能

    这篇文章主要介绍了Java远程连接Linux服务器并执行命令及上传文件功能,本文是小编整理的代码笔记,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • Springboot 2.x集成kafka 2.2.0的示例代码

    Springboot 2.x集成kafka 2.2.0的示例代码

    kafka近几年更新非常快,也可以看出kafka在企业中是用的频率越来越高。本文主要为大家介绍了Springboot 2.x集成kafka 2.2.0的示例代码,需要的可以参考一下
    2022-04-04

最新评论