美文网首页
Log4j打印错误异常的详细堆栈信息

Log4j打印错误异常的详细堆栈信息

作者: 背对背拥抱 | 来源:发表于2020-03-03 19:29 被阅读0次

一、结论:

  1. Logger类下有多个不同的error方法,根据传入参数的个数及类型的不同,自动选择不同的重载方法。
  2. logger.error(Object obj)只传入一个参数时会将异常对象作为Object使用,并最终当做String打印出来;
  3. 当使用两个参数logger.error(String message, Throwable t),且第二个参数为Throwable时,才会将完整的异常堆栈打印出来。

二、代码示例:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
* @author ZL
* @date 2020年2月26日 上午10:32:58
* @Description 
*/
public class TestLog4j2 {

     private static final Logger logger = LogManager.getLogger(TestLog4j2.class);
        public static void main(String[] args) {
            try {
                int i = 1/0;
            } catch (Exception e) {
                logger.error("使用 + 号连接直接输出 e :"+e);
                System.out.println("--------------------------------------------");
                logger.error("使用 + 号连接直接输出 e.toString() :"+e.toString());
                System.out.println("--------------------------------------------");
                logger.error("使用 + 号连接直接输出 e.getMessage() :"+e.getMessage());
                System.out.println("--------------------------------------------");
                logger.error("使用 ,号 且第二个参数为Throwable :",e);
                System.out.println("--------------------------------------------");
                logger.error("第二个参数为Throwable,使用分隔符{} :",e);
                System.out.println("--------------------------------------------");
                logger.error("第二个参数为Object,使用分隔符{} :","AAA");
                System.out.println("--------------------------------------------");
                
            }
        }
}

信息输出:
[图片上传失败...(image-2090bd-1583234979820)]

三、查看源码中的方法描述

根据方法重载特性,当只输入一个参数时,此对象会被当做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);

四、结论:

  1. 使用Logger.error(e)Logger.error(e.getMessage())Logger.error("some msg" + e)Logger.error("some msg" + e.getMessage()) 都是调用的logger.error(Object message),这个方法都会将入参当作Object输出,不会打印堆栈信息。
  2. 在使用Logger.error("first param ",e)时会调用logger.error(String message, Throwable t),此方法会完整的打印出错误堆栈信息。

本文参考于https://www.cnblogs.com/lingyejun/p/9366533.html

相关文章

  • 日志打印无堆栈信息

    情况:系统抛出异常,日志没有打印堆栈信息 错误日志正常打印 分析:异常信息打印格式没有错误,本地测试没有问题,线上...

  • Log4j打印错误异常的详细堆栈信息

    一、结论: Logger类下有多个不同的error方法,根据传入参数的个数及类型的不同,自动选择不同的重载方法。 ...

  • log4j 不打印异常堆栈

    问题最近在线上系统的错误日志中发现了一个现象 : 代码里用log4j打印系统运行时异常堆栈信息,在错误日志中无法看...

  • zerolog日志高级使用

    使用github.com/pkg/errors打印详细的堆栈信息,输出非常友好。 设置堆栈打印详细调用过程 输出详...

  • 异常与调试

    通过try...except...finally处理异常。 调用堆栈 出现异常返回时,会打印调用堆栈 记录错误 抛...

  • log exception without trace 异常信息

    1.可用率报警后查看异常日志,发现打印的异常信息,没有堆栈信息 2.检查日志打印格式,是按照异常对象打印的,是正确...

  • SpringBoot详细打印启动时异常堆栈信息

    SpringBoot在项目启动时如果遇到异常并不能友好的打印出具体的堆栈错误信息,我们只能查看到简单的错误消息,以...

  • 查看JVM信息的命令

    1. jstack 获取线程堆栈信息 打印堆栈信息到标准输出 jstack PID 打印堆栈信息到标准输出,会打印...

  • java 正确的日志使用习惯

    禁止使用e.printStackTrace() e.printStackTrace()打印的是异常堆栈信息,会额外...

  • jvm参数配置

    核心配置参数:-OmitStackTraceInFastThrow:当大量异常时,jvm默认不打印后面的堆栈信息,...

网友评论

      本文标题:Log4j打印错误异常的详细堆栈信息

      本文链接:https://www.haomeiwen.com/subject/dzgklhtx.html