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

Posted 格子衫111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

以上是关于Logger.error还不知道怎么传参打印?看完这个你就明白了的主要内容,如果未能解决你的问题,请参考以下文章

logger.error完整打印错误堆栈信息

在error日志打印异常

看完这篇你还不知道这些队列,我这些图白作了

看完这个还不了解redis的SDS,半夜你来扒我家墙头

看完这篇还不懂线程与线程池你来打我

看完这篇还不懂高并发中的线程与线程池你来打我(内含20张图)