0

0

在Java中如何记录异常日志_Java异常日志处理解析

P粉602998670

P粉602998670

发布时间:2026-01-18 11:18:09

|

498人浏览过

|

来源于php中文网

原创

不能只用e.printStackTrace()记录异常,因其输出到System.err、不可控且不支持结构化日志;应使用logger.error("msg", throwable)配合SLF4J+Logback/Log4j2,并注意MDC透传与上下文传递。

在java中如何记录异常日志_java异常日志处理解析

为什么不能只用 e.printStackTrace() 记录异常

它把堆输出到 System.err,无法控制输出位置、格式和级别,也不支持异步写入或日志轮转。生产环境里,这类日志会丢失、难检索、干扰标准输出,且无法按 ERROR 级别被监控系统捕获。

  • 调试时临时用可以,上线必须替换
  • Spring Boot 默认日志框架(Logback/Log4j2)不接管 printStackTrace() 输出
  • 微服务中跨线程或异步调用时,printStackTrace() 可能打印在错误的线程上下文中

logger.error(String, Throwable) 正确记录异常

这是 SLF4J + Logback/Log4j2 的标准做法:消息和异常对象分开传入,框架自动将堆栈合并进日志行,保留结构化字段(如 traceId),并支持 MDC 上下文透传。

try {
    riskyOperation();
} catch (IOException e) {
    logger.error("文件读取失败,路径:{}", filePath, e); // 注意:e 是第三个参数,不是拼在字符串里
}
  • 不要写成 logger.error("文件读取失败:" + e) —— 这会丢失堆栈,只剩 toString() 结果
  • 异常对象必须作为最后一个独立参数传入,否则框架无法识别并格式化堆栈
  • 如果用了 MDC(如 MDC.put("traceId", id)),这个 traceId 会自动附加到整条日志中

哪些异常需要显式记录,哪些该抛出

核心原则:只记录你「处理了」但依然需要留痕的异常;对无法恢复的、上游应感知的异常,优先抛出(或包装后抛出),由更高层统一记录。

  • 捕获 SQLException 后重试了三次仍失败 → 记录 ERROR,并抛出自定义业务异常 DataAccessException
  • 解析用户上传的 JSON 失败 → 记录 WARN(含原始内容前100字符),返回 400,不抛出底层 JsonProcessingException
  • 空指针(NullPointerException)或数组越界(ArrayIndexOutOfBoundsException)通常代表代码缺陷 → 不要静默捕获记录,应让其崩溃并触发告警

Logback 中避免堆栈日志被截断或乱码

默认配置下,长堆栈可能被截断,中文路径或消息可能显示为 ???。关键在 encoderpattern 设置。

企奶奶
企奶奶

一款专注于企业信息查询的智能大模型,企奶奶查企业,像聊天一样简单。

下载

立即学习Java免费学习笔记(深入)”;


  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%ex{full}
  < charset>UTF-8

  • %ex{full} 确保输出完整堆栈(默认只打一层)
  • 必须显式声明 UTF-8,否则 Windows 控制台或某些 ELK 接入端会乱码
  • 如果用异步 Appender(AsyncAppender),记得设置 includeCallerData="true",否则 %class%line 会为空

实际项目中最容易被忽略的是:在 CompletableFuture 或 @Async 方法里,未将 MDC 上下文手动传递,导致日志丢失 traceId;还有就是把异常吞掉后只记了一行 warn 却没留任何可定位的现场信息(比如缺失 requestId、参数摘要)。这些不是配置问题,是日志意识问题。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

835

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

741

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

736

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

399

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

446

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

430

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

C# 教程
C# 教程

共94课时 | 7万人学习

Java 教程
Java 教程

共578课时 | 47.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号