Slf4j error方法如何打印格式化字符串 异常堆栈信息

SLF4J使用教程以及常见问题解决(最新稳定版) 1.简介 官网:https://www.slf4j.org/manual.html (1)简单日记门面(simple logging Facade for Java)SLF4J是为各种loging APIs提供一个简单统一的接口。 (2)slf4j并不是一种具体的日志系统,而是一个用户日志系统的facade。 (3)在部署时,选择不同的日志系统包,即可自动转换到不同的日志系统上。 如:选择JDK自带的日志系统,则只需要将slf4j-api-XXX.jar和slf4j-jdkXXX.jar放置到classpa 阅读详情

需求:打印error时,既想打印带参数的字符串,也想打印异常堆栈信息

Answer:只需调用log.error格式化字符串,并且把堆栈信息参数e放到最后一个即可

@Slf4j
public class LogTest {
    @Test
    public void testLog() {
        String s = "Hello world";
        try {
            Integer i = Integer.valueOf(s);
        } catch (NumberFormatException e) {
            // 异常堆栈必须是最后一个参数
            log.error("Failed to format {}", s, e);
            // log.error("Failed to format {}", e, s);
        }
    }
}

Why?

跟随debug的脚步,我们会来到下面这个方法内部:

image-20191118155221581

显而易见,当判断传入的格式化参数数组的最后一个参数继承自Throwable类时,就会将其识别出堆栈信息供打印日志github:https://github.com/xdlkc

如何用slf4j打印日志既使用占位符又打印异常堆栈信息(仍然使用{}占位符,不拼接,不使用String.format) 即可,e是异常,作为最后一个参数,即使最终参数的个数比 {} 占位符多,但是实际是可以的(并且IDEA非常智能不会提示参数个数匹配不上的警告)。之前有过一个疑惑,就是使用slf4j的API去打印错误日志的时候,如果既要打印参数又要打印异常的堆栈信息,则前面的部分只能用字符串拼接的方式,如。其实使用 String.format 有个不好的地方,就是如果参数对不上直接抛异常而不是像log.xxxx() 那样只是忽略,或者只能使用变通的方式,比如。其实slf4j的有些api是已经支持了的! 阅读详情

相关推荐

Java日志框架实战指南:从SLF4J、Log4j2到生产环境配置

日志是软件系统可观测性的基础组件,其核心价值在于记录程序运行状态、辅助问题排查与系统监控。在Java生态中,日志体系通常采用三层架构设计:日志门面(如SLF4J)提供统一API,日志实现(如Logback、Log4j2)负责具体输出,桥接器解决历史框架兼容问题。这种架构实现了业务代码与具体日志实现的解耦,提升了系统的可维护性。从技术原理层面,异步日志、无锁数据结构等优化手段能显著提升高并发场景下的性能表现,而合理的日志级别设计、滚动归档策略则是保障生产环境稳定运行的关键。在实际工程实践中,日志系统需要与监控

Hi, Sun 492

SLF4J warning或error信息含义以及解决方法

介绍 结合译文https://www.slf4j.org/codes.html和目前使用slf4j遇到的问题整理成文。 译文来源 译文来源 https://www.slf4j.org/codes.html Failed to load class org.slf4j.impl.StaticLoggerBinder 原因和含义 当org.slf4j.impl.StaticLog...

学而不厌 诲人不倦 3163

java 日志异常格式化字符串

/** 异常处理字符串格式化 **/ public class DatabaseException extends Exception{ public DatabaseException(int transactionID, int queryID, String message) { super(String.format("(t%d, q%d) %s",transactionI

极客栈 2905

SLF4j日志基本使用

SLF4j日志基本使用

qq_43297569的博客 1964

【自用】吉林大学计算机系统结构第二章:缓存优化 曲冠南老师版 笔记

容量8KB,2的十三次方,块大小16B,一块用掉四位,剩余2的九次方是标志位,则有512行,每个元素8B,则一块两个元素,a数组150块,b数组152块,不出现容量失效。不管是否交换内容,在同一“伪相联”组中的两块都是用同一个索引得到的,因此失效率相同,即:失效率伪相联=失效率2路。伪相联cache的命中时间等于直接映象cache的命中时间加上伪相联查找过程中的命中时间*该命中所需的额外开销。(6) 由编译器控制的预取,硬件预取的替代方法,在编译时加入预取的指令,在数据被用到之前发出预取请求。

weixin_73587775的博客 1616

WPS接入DeepSeek,实现AI辅助功能

总的来说,借助 WPS 中宏功能与 DeepSeek 大模型的结合,文档处理、内容创作和数据分析等任务都能更加智能化、自动化。这不仅大幅提升了工作效率,也为办公场景带来了全新的智能化办公体验。

运维老生常谈 3805

【深入日志打印】log.error(“你好{}“, “世界“, e);只有一个占位符是否会打印后面多出的参数呢?(详细跟进源码讲解调试分析)

直接在try里弄一个除以0的报错,然后打印日志,日志字符串里只设置了一个占位符,传2个参数过去,是否会打印两个参数呢?

HumorChen的博客 2837

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

Qwen3-Max 在使用 SLF4J(Simple Logging Facade for Java) 打印 error 日志并传入参数时,推荐使用 占位符 {} 的方式

在使用 SLF4J(Simple Logging Facade for Java) 打印 error 日志并传入参数时,推荐使用 占位符 {} 的方式,这是 SLF4J 的标准做法,既高效又安全。多参数 log.error(“A={}, B={}”, a, b);log.error(“操作失败: {}, ID: {}”, exception, id);log.error(“操作失败,ID: {}”, id, exception);// ❌ 错误:异常不在最后,不会打印堆栈!

m0_37843156的博客 599

【BAAS】基于supabase的知识库详细设计

为满足快速开发需要和减少开发及维护成本,使用BAAS(Backend-as-a-Service)模式可以很好的降低我们的后端维护成本,并提高前端对接效率。一般来说,BAAS是一种云服务模式,BaaS供应商会为提供一些通用的能力,例如用户身份验证、数据库管理、远程更新和推送通知(针对移动应用程序),以及云存储和自托管。BaaS最主流的是Google的firebase,具有相当完善的功能和集成方案,但他是收费的,而且在我们实际项目中,可能需要私有化部署,这时就需要一些开源的替代方案,例如主流的。

Ric的博客 1781

Android NDK/JNI面试题大全及参考答案(3万字长文)

是一套工具集合,它允许开发者为Android平台编写原生应用程序或者应用程序的部分模块。NDK 主要用于开发那些需要高性能计算的应用程序,例如游戏引擎、图像处理软件或音频/视频编码解码器等。通过使用 C 或 C++ 编写代码,开发者可以利用硬件加速功能,提高应用性能。NDK 提供了一系列工具来帮助开发者完成从源代码到可执行文件的整个过程,包括编译、链接、调试等功能。

大模型大数据攻城狮的专栏 1257

SLF4J日志占位符{}的坑:异常堆栈消失与参数匹配规则

在Java后端开发中,参数化日志是记录运行时状态的基础手段,而{}占位符则是最常见的格式化写法。很多开发者以为只要参数个数与占位符个数相等,日志输出就必然正确,但SLF4J的匹配机制远比想象中严格:参数按顺序消费,异常对象只有在占位符数量等于参数数量减一时才会被剥离并输出完整堆栈,否则就退化为普通toString文本,导致异常堆栈丢失。这种隐蔽问题在线上故障排查时尤为致命,日志平台中检索不到原始错误,只能反复加日志发版定位。理解占位符与参数数组的配对规则,不仅能避免日志失真,还能让日志监控、告警和代码审查更

weixin_28736335的博客 253

LangGraph-StateGraph 和 Graph API 源码分析

摘要: StateGraph是LangGraph的核心API,用于构建有状态工作流图。本文分析了其实现原理,包括: 核心类关系:StateGraph(构建器)和CompiledStateGraph(继承自Pregel的可执行图) 关键流程:状态模式到通道的映射、节点到PregelNode的转换 实现特点: 支持TypedDict和Pydantic两种状态模式 自动选择通道类型(LastValue或BinaryOperatorAggregate) 通过映射函数处理节点输入输出 边实现基于通道写入机制 编译过程

838

SLF4J日志中的log.error:异常对象位置决定堆栈输出

日志排障中,完整异常堆栈往往决定定位效率。作为Java生态最常用的日志门面,SLF4J提供参数化日志能力,其背后隐藏一条关键规则:当log.error的参数列表末尾存在Throwable且无对应占位符时,日志框架会自动提取该异常并输出完整堆栈;反之若异常对象占用占位符,则只显示toString结果,堆栈丢失。掌握这一原理,可以规范异常日志写法,保留endpoint、method等上下文信息的同时获得Caused by链条。在Spring Boot项目中,配合Logback的%ex模式配置,即可稳定输出高质量

weixin_30086969的博客 204

【python爬虫--爬取电商商品及对其销量、好差评等数据进行分析】Python爬虫爬取电商商品及大数据分析-实战

选择目标电商网站:这里选择爬取两个不同电商网站(比如京东、淘宝)上的商品数据,包括商品名称、价格、销量和评价信息。编写爬虫:通过爬虫获取商品信息并保存数据。数据清洗与对齐:将两个电商网站抓取到的数据进行统一清洗和对齐。数据分析:进行销量分析、好评与差评分析等。

Dreams°的博客 4013

华为Ascend_toolkit在x86ubuntu安装失败报错。[WARNING] driver package is not installed. If you install in docker

这个报错发生在交叉编译配置Ascend_toolkit环境时,安装Ascend_toolkit安装包的时候发生。[Y/N]Y。

anananajiushiwo的博客 1019

Spring Boot异常日志:log.error占位符与异常堆栈的正确使用

日志记录是后端排查问题的关键环节,而SLF4J作为Spring Boot默认的日志门面,其占位符机制决定了异常对象的处理方式。很多开发者在使用log.error时,将异常对象与占位符参数混用,导致堆栈信息丢失,只留下一行无法定位的错误消息。本文从日志框架的参数绑定规则出发,解析Throwable必须位于参数列表末尾的特殊设计,并介绍如何通过Logback配置、MDC链路追踪和异常堆栈深度控制,在生产环境中输出完整且高效的错误日志。同时结合文件上传等实际场景,给出异常日志的正确写法、日志级别选择及脱敏方案,帮

weixin_33417488的博客 184

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

org.slf4j.Logger打印日志的使用(需要的拿走)

org.slf4j.Logger打印并输出日志 log4j定义了8个级别的log优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。 log4j默认的优先级为ERROR。 ALL 最低等级的,打开所有日志记录 DEBUG 主要用于开发过程中打印一些运行信息。 INFO 突出强调应用程序的运行过程中打印一些你感兴趣的或者重要的信息,不能滥用,避免打印过多的日志。 WARN 表明会出现潜在错误的情形,有些信息不是错误信息,给程序员的一些提示。 ERROR

qq_44718303的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【实用技巧】Java 异常精准定位:从堆栈信息中快速定位报错行

利用可解析异常的类、方法、行号,实现报错位置精准定位,尤其适合接手新项目时快速排查问题;核心操作是获取堆栈数组的第一个元素(),直接定位最外层报错代码;建议集成到全局异常处理器中,统一管控项目的异常日志格式,提升团队排查问题的效率。通过这个小技巧,能让异常日志从 “只知错,不知在哪错”,变成 “既知错,也知在哪错”,大幅降低新项目的问题排查成本。

m0_58709145的博客 234

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Log4j+Slf4j日志框架

Log4j日志输出简介日志属性配置文件什么是日志附加器?常用的附加器实现类Log4j日志级别日志级别为什么要对日志进行分级Slf4j 简介POM创建` log4j.properties` 配置文件附:占位符说明 日志输出简介 Log4j 的日志输出控制文件,主要由三个部分构成: 日志信息的输出位置:控制日志信息将要输出的位置,是控制台还是文件等。 日志信息的输出格式:控制日志信息的显示格式,即以怎样的字符串形式显示。 日志信息的输出级别:控制日志信息的显示内容,即显示哪些级别的日志信息。 有了日志输出控制

输入技术、输出想法 2786

日志打印最佳实践

微服务架构体系中有一个重要的点就是第三方永远不可信,对于第三方服务远程调用建议打印请求和响应的参数,方便在和各个终端定位问题,不会因为第三方服务日志的缺失变得手足无措。原因: e.printStackTrace()语句产生的字符串记录的是堆栈信息,如果信息太长太多,字符串常量池所在的内存块没有空间了,即内存满了,系统请求将被阻塞。:这类捕获的异常是系统告知开发人员需要加以关注的,是质量非常高的报错。:系统中核心角色触发的业务动作是需要多加关注的,是衡量系统正常运行的重要指标,建议记录INFO级别日志。

编程语言与各种框架(Java,python) 1238

PHP女程序猿学习Java的Day-10

​在Java开发中,日志打印是快速定位和跟踪异常的重要手段。通过合理配置和使用日志框架,可以有效地记录程序运行状态、变量值以及异常信息,从而帮助开发者迅速找到问题根源。

汪原野 869

将 Sentinel 日志无缝桥接到 SLF4J:sentinel-logging-slf4j 扩展深度解析与配置实战

本篇技术指南围绕 Sentinel 官方日志桥接扩展 `sentinel-logging-slf4j` 展开,讲解如何将 Sentinel 内部日志(记录日志与命令中心日志)接入基于 SLF4J 的日志体系(如 Log4j2、Logback),实现日志级别、输出目标与格式的统一管理。读完本文,你将掌握该扩展的依赖引入方式、SPI 底层工作原理、两个内置 Logger 的命名约定,以及一份可直接落地

gitblog_00707的博客 216

Java异常处理与日志记录最佳实践分享

全局异常处理在Spring Boot项目中,利用统一处理HTTP层异常,将异常转化为统一的Result返回给前端,同时记录详细日志。DAO层异常转译在数据访问层捕获SQLException等检查异常时,将其转为自定义的系统异常(如SystemException),以便在上层统一处理,同时避免把底层细节暴露给业务层。业务逻辑层预检在方法入口处对参数和状态进行预检,尽可能避免进入错误分支,从而减少不必要的异常抛出和捕获。日志监控与告警。

weixin_43563498的博客 1271

Java 日志框架详解:SLF4J + Logback 从入门到实战

本文介绍了SLF4J和Logback日志框架的核心功能与配置方法。SLF4J提供高效的占位符支持、MDC多线程追踪和五种日志级别(TRACE到ERROR)。Logback作为SLF4J实现,具有高性能、自动重载配置、灵活输出方式等特点。重点讲解了Logback配置文件的编写,包括全局变量定义、Appender配置(控制台/文件输出)、滚动策略、异步日志等,并提供了完整配置示例。通过合理配置可实现自定义日志格式、级别过滤和分布式链路追踪,提升系统可观测性。

niairuochen的博客 358

日志常见问题

日志常见问题 1.不要用System.out.println() 打的日志只会显示在控制台,不会进入日志文件,而且这个方法内部是用了synchronized的,是同步的 2.不要使用 e.printStackTrace() 其源码: public void printStackTrace() { printStackTrace(System.err); } 也是打在控制台的 3.输出异常信息,不要...

qq_39172525的博客 569
上一篇: 常用正则表达式
下一篇: 一年一度的开发者专属83行代码挑战赛来啦
xdlkc
博客等级 码龄10年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值