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还不知道怎么传参打印?看完这个你就明白了的主要内容,如果未能解决你的问题,请参考以下文章