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

news2025/8/16 16:28:47

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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress Mixed Content混合内容警告:4 种简单的修复方法

如果您在 WordPress 网站上看到混合内容警告,请不要惊慌,它是一个常见警告。即使您安装了 SSL(安全套接字层)证书,也可能在任何网站上发生这种情况。 WordPress Mixed Content混合内容警告不会阻止您的网站在页面上显示…

[附源码]java毕业设计医学季节性疾病筛查系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

学生Dreamweaver静态网页设计 基于HTML+CSS+JavaScript制作简食餐厅美食网站制作

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

计算机组成原理4小时速成:系统总线,片内总线,系统总线,通信总线,数据总线,地址总线,控制总线,传输率=带宽/传输周期

计算机组成原理4小时速成:系统总线,片内总线,系统总线,通信总线,数据总线,地址总线,控制总线,传输率带宽/传输周期 2022找工作是学历、能力和运气的超强结合体,遇到寒冬…

知识图谱-KGE-对抗模型-2018:KBGAN

KBGAN paper: KBGAN: Adversarial Learning for Knowledge Graph Embeddings 论文 本文是清华大学的一名同学发表在 NAACL(虽然是 C,但是是北美的 ACL) 2018 上的一篇文章,提出了 KBGAN,首次使用生成对抗网的思想做…

【配电网优化】配电网潮流计算与经济调度模糊满意度评价【含GUI Matlab源码 2159期】

⛄一、配电网潮流计算与经济调度模糊满意度评价软件介绍 单击guimh.m文件打开系统主界面,如图1所示,界面友好、简单、易于操作。主界面上方有一个“开始”按钮,可以控制整个软件的执行。主界面右方有三个选项,分别为“配电网潮流…

S32DS 调用脚本实现Post-build处理

作者:Stephen Du 免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。 所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准)。 复制/转发请注明来源/…

【目标检测】swin-transformer的学习

文章目录1. swin-transformer2. swin-transformer的结构1. swin-transformer 优点: 解决transformer在cv领域速度慢的问题保持CNN的位移不变性、尺寸不变性、感受野与尺寸的关系、分阶段降低分辨率等特点在多领域表现SOTA 缺点: 不具备CNN的权值共享…

常用框架技术-07 Apache Dubbo 一款高性能、轻量级的开源Java RPC框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言1.软件架构的演进过程1.1 集群和分布式1.2 单体架构1.2.1 架构说明1.2.2 优点1.2.3 缺点1.3 垂直架构1.3.1 架构说明1.3.2 优点1.3.3 缺点1.4 SOA架构1.4.1 架构…

[附源码]计算机毕业设计JAVA旅游景点推荐系统

[附源码]计算机毕业设计JAVA旅游景点推荐系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

dolphinscheduler-数据质量-源码分析

数据质量工作流程 数据质量运行流程分为2个部分:在web端进行数据质量检测的流程定义,通过dolphinscheduer进行调度,提交到spark计算引擎;spark端负责解析数据质量模型的参数,通过读取数据、执行转换、输出三个步骤&am…

Java -- 每日一问:谈谈常用的分布式ID的设计方案?Snowflake是否受冬令时切换影响?

典型回答 首先,我们需要明确通常的分布式 ID 定义,基本的要求包括: 全局唯一,区别于单点系统的唯一,全局是要求分布式系统内唯一。 有序性,通常都需要保证生成的 ID 是有序递增的。例如,在数据…

小体积单输入单输出单电源供电光电隔离转换器0-75mV/0-5V/0-200mV/0-20mA/4-20mA

概述: 导轨安装DIN11 IPO OC系列模拟信号隔离放大器是一种将输入信号隔离放大、转换成按比例输出的直流信号混合集成厚模电路。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等需要直流信号隔离测控的行业。此系列产品内部采用了线性光电隔离技术相…

Unity | 以附加模式加载场景,实现多场景叠加及注意事项

1 多场景叠加 Unity 允许多场景叠加,这种叠加包括编辑模式及运行模式 新建两个简单的场景,SampleScene 和 AdditiveScene,设置不同的天空盒及平行光源颜色 SampleScene AdditiveScene 2 编辑模式 2.1 添加场景 在编辑器中的场景资源右键选…

vue draggable怎么用?怎么写一个拖拽的看板?

项目中需要像看板一样的可以拖动的任务队列 如果自己要手写的话会很麻烦,大佬当我没说。市面上目前有很多成熟的组件,本次介绍的这个就是一个轻量级的应用。 sortable.js中文文档 - itxst.com 常规的vue文件使用,可以参考上面的网站。 本次…

C语言习题练习10--指针

1.代码结果 #include <stdio.h> int main() {int arr[] {1,2,3,4,5};short *p (short*)arr;int i 0;for(i0; i<4; i){*(pi) 0;}for(i0; i<5; i){printf("%d ", arr[i]);}return 0; } 正常&#xff1a;0001--00 02--00 03--00 04--00 05 数组内部是倒…

[附源码]java毕业设计医院管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【转】数据库索引详细介绍

原文链接&#xff1a;https://blog.csdn.net/weixin_41948075/article/details/100009848 索引的定义 索引相当于一本书的目录&#xff0c;通过目录我们可以迅速定位书中要找的内容。MySQL中的索引也是一样&#xff0c;它是一种帮助MySQL高效获取数据的数据结构&#xff08;树…

Docker中php安装redis扩展

第一步&#xff1a;下载redis扩展压缩包 点击下载redis-5.3.7 &#xff0c;其他版本请访问&#xff1a;https://pecl.php.net/package/redis 第二步&#xff1a;加压压缩包 linux下解压&#xff1a;tar -zxvf redis-5.3.4.tgz windows下解压&#xff1a;自己学习 第三步&#…

暴雪网易事件大讨论:Web3游戏未来发展趋势

最近很多小伙伴们询问进群方式&#xff0c;希望能和NFT玩家&#xff0c;链游行家和数字艺术家们交流和学习&#xff0c;直接戳我【ID:cdf0822】就好&#xff01;文末也有联系方式&#x1f618; 11月17日下午&#xff0c;暴雪中国官方直接绕过现任代理商网易直接发布公告称&…