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("-----------------------------------------------------------------------" );
    }
  }
}

二、打印结果

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

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

public void error(String msg);

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

public void error(String msg, Throwable t);

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

public void error(String format, Object arg);

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"+变量);

或者

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

或者

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

或者

log.error("some msg{},another msg:",变量1,e);
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值