Logger.error还不知道怎么传参打印?看完这个你就明白了
创始人
2024-02-13 00:38:26
0

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方法,第二个参数为Throwablelog.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 zeroat 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 zeroat 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 zeroat 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 zeroat 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);

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...