• Logger.error还不知道怎么传参打印?看完这个你就明白了


    Logger.error方法打印出堆栈信息,非常重要,可以使我们快速定位出相关问题,提高效率。
    但是Logger.error有多个重载方法,不同的传参,打印结果各不一样。
    下面,来看一个示例,

    一、代码示例

    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 测试log的打印情况
     */
    public class TestLogError {
    
      public static final Logger log = LoggerFactory.getLogger(TestLogError.class);
    
      public static void main(String[] args) {
        try{
          // 模拟算术异常
          int a=1/0;
    
        }catch (Exception e){
          /* 一、调用1个参数的error方法:error(String msg),都不会打印堆栈信息 */
          // 使用字符串拼接
          log.info("-----------------------------------------------------------------------" );
          log.error("使用 + 号连接直接输出 e : " + e);
          log.info("-----------------------------------------------------------------------" );
          log.error("使用 + 号连接直接输出 e.getMessage() : " + e.getMessage());
          log.info("-----------------------------------------------------------------------" );
          log.error("使用 + 号连接直接输出 e.toString() : " + e.toString());
          log.info("-----------------------------------------------------------------------" );
    
          /* 二、调用2个参数的error方法:error(String msg, Throwable t),都会打印堆栈信息 */
          // 使用逗号分隔,调用两个参数的error方法,第二个参数为Throwable
          log.error("使用 , 号 使第二个参数作为Throwable : ", e);
          log.info("-----------------------------------------------------------------------" );
          // 尝试使用分隔符,第二个参数为Throwable,会发现分隔符没有起作用,第二个参数的不同,调用不同的重载方法
          log.error("使用 , 号 第二个参数为Throwable,加分隔符 {} : ", e);
          log.info("-----------------------------------------------------------------------" );
    
          /* 二、调用2个参数的error方法:error(String format, Object arg) */
          // 使用逗号分隔,调用两个参数的error方法,第二个参数为Object,不加分隔符,不会打印第2个参数的信息
          log.error("使用 , 号 使第二个参数作为Object,不加分隔符 : ", 123);
          log.info("-----------------------------------------------------------------------" );
          // 使用逗号分隔,调用两个参数的error方法,第二个参数为Object,加分隔符,会打印第2个参数的信息
          log.error("使用 , 号 使第二个参数作为Object,加分隔符: {}", 123);
          log.info("-----------------------------------------------------------------------" );
    
          /* 三、调用多个参数的error方法:error(String format, Object... arguments) */
          // 多个参数为Object,可打印不同的类型
          log.error("多个参数,全部为Object,打印1:{},打印2:{},打印3:{}",123,"haha",true);
          log.info("-----------------------------------------------------------------------" );
          // 多个参数,结尾参数为Throwable,Throwable参数加了分隔符,发现分隔符无效,会打印堆栈信息
          log.error("多个参数,Throwable参数放结尾,加分隔符,打印1:{},打印2:{},异常3:{}",123,"haha",e);
          log.info("-----------------------------------------------------------------------" );
          // 多个参数,中间参数为Throwable,Throwable参数加了分隔符,发现分隔符有效,不会打印堆栈信息
          log.error("多个参数,Throwable参数不放结尾,加分隔符,打印1:{},异常2:{},打印3:{}",123,e,"haha");
          log.info("-----------------------------------------------------------------------" );
          // 多个参数,结尾参数为Throwable,Throwable参数不加分隔符,会打印堆栈信息
          log.error("多个参数,Throwable参数放结尾,不加分隔符,打印1:{},打印2:{},异常3:",123,"haha",e);
          log.info("-----------------------------------------------------------------------" );
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59

    二、打印结果

    15:04:56.581 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.587 [main] ERROR com.zwt.mainTest.TestLogError - 使用 + 号连接直接输出 e : java.lang.ArithmeticException: / by zero
    15:04:56.587 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.587 [main] ERROR com.zwt.mainTest.TestLogError - 使用 + 号连接直接输出 e.getMessage() : / by zero
    15:04:56.587 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.587 [main] ERROR com.zwt.mainTest.TestLogError - 使用 + 号连接直接输出 e.toString() : java.lang.ArithmeticException: / by zero
    15:04:56.587 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.591 [main] ERROR com.zwt.mainTest.TestLogError - 使用 , 号 使第二个参数作为Throwable : 
    java.lang.ArithmeticException: / by zero
    	at com.zwt.mainTest.TestLogError.main(TestLogError.java:16)
    15:04:56.591 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.591 [main] ERROR com.zwt.mainTest.TestLogError - 使用 , 号 第二个参数为Throwable,加分隔符 {} : 
    java.lang.ArithmeticException: / by zero
    	at com.zwt.mainTest.TestLogError.main(TestLogError.java:16)
    15:04:56.591 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.591 [main] ERROR com.zwt.mainTest.TestLogError - 使用 , 号 使第二个参数作为Object,不加分隔符 : 
    15:04:56.593 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.593 [main] ERROR com.zwt.mainTest.TestLogError - 使用 , 号 使第二个参数作为Object,加分隔符: 123
    15:04:56.593 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.593 [main] ERROR com.zwt.mainTest.TestLogError - 多个参数,全部为Object,打印1:123,打印2:haha,打印3:true
    15:04:56.593 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.593 [main] ERROR com.zwt.mainTest.TestLogError - 多个参数,Throwable参数放结尾,加分隔符,打印1:123,打印2:haha,异常3:{}
    java.lang.ArithmeticException: / by zero
    	at com.zwt.mainTest.TestLogError.main(TestLogError.java:16)
    15:04:56.593 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.593 [main] ERROR com.zwt.mainTest.TestLogError - 多个参数,Throwable参数不放结尾,加分隔符,打印1:123,异常2:java.lang.ArithmeticException: / by zero,打印3:haha
    15:04:56.593 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    15:04:56.593 [main] ERROR com.zwt.mainTest.TestLogError - 多个参数,Throwable参数放结尾,不加分隔符,打印1:123,打印2:haha,异常3:
    java.lang.ArithmeticException: / by zero
    	at com.zwt.mainTest.TestLogError.main(TestLogError.java:16)
    15:04:56.593 [main] INFO com.zwt.mainTest.TestLogError - -----------------------------------------------------------------------
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    分析:在这里插入图片描述

    1、e.getMessage() :打印“/ by zero”;e.toString():打印“java.lang.ArithmeticException: / by zero”;由此可见,这两个方法都不会打印堆栈信息;

    2、当只输入一个参数时,此对象会被当做Object进行打印输出,如果是Exception e的话,这里直接就toString(),不会打印堆栈信息

    public void error(String msg);
    
    • 1

    3、当有两个参数,第二个参数为Throwable时,会打印出异常信息,并且包含异常堆栈信息;

    public void error(String msg, Throwable t);
    
    • 1

    4、当有两个参数,第二个参数为Object时,调用方法不同,会根据占位符进行替换并打印出错误日志;

    public void error(String format, Object arg);
    
    • 1

    5、当有多个参数,结尾参数为Throwable时,才会打印堆栈信息,其他参数,会根据占位符进行替换并打印出错误日志;

    三、结论

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

    • 使用e.getMessage()、e .toString() 都不会打印堆栈信息,最好直接打印e。

    • 当error(Object obj)只传入一个参数时会将异常对象作为Object使用,并最终当做String打印出来,不会打印堆栈信息。

    • 当使用两个参数error(String message, Throwable t),且第二个参数为Throwable时,才会将完整的异常堆栈打印出来。

    • 使用多个参数的error方法时,如果需要包含e参数,要把e参数放在末尾,才会完整的打印出错误堆栈信息。如:Logger.error("打印1{},打印2{},异常信息: ",123,“456”,e)。

    四、推荐

    1、如果只需打印Object类型的数据,推荐使用:
    log.error("some msg"+变量);
    
    • 1

    或者

    log.error("some msg{}",变量);
    
    • 1

    或者

    log.error("some msg{},another msg{}",变量1,变量2);
    
    • 1
    2、如果打印包含Throwable类型的数据,推荐使用:
    log.error("some msg",e);
    
    • 1

    或者

    log.error("some msg{},another msg:",变量1,e);
    
    • 1
  • 相关阅读:
    深度学习之PyTorch实战(5)——对CrossEntropyLoss损失函数的理解与学习
    java和js实现MD5加密
    vue之路由、无痕浏览加Nodejs环境安装及elementui介绍
    什么是线程死锁?死锁如何产生?如何避免线程死锁?
    Tableau长期免费使用的方法总结
    [ubuntu]ubuntu22.04默认源和国内源
    JAVASE总结作业----面向对象的三大特征
    LeetCode_前缀和_滑动窗口_中等_930.和相同的二元子数组
    centos httpd
    C++【类的自动类型转换和强制类型转换】,总要了解一下
  • 原文地址:https://blog.csdn.net/u012660464/article/details/128018002