应将throwable直接传给logger.error等方法,logback会自动格式化完整堆栈;避免字符串拼接或printstacktrace();配置pattern含%ex;按异常类型选error/warn;结合mdc增强上下文。

在 catch 块中用 Logback 正确打印异常堆栈,关键不是手动调用 printStackTrace(),而是把 Throwable 对象直接传给 logger 的日志方法。Logback 会自动捕获并格式化完整的堆栈信息。
用带 Throwable 参数的 log 方法(推荐)
Logback 的 logger.error(String, Throwable) 等重载方法专为此设计。它会在日志消息后追加结构化、可读性强的堆栈跟踪,且支持异步日志、MDC、过滤等特性。
- ✅ 正确写法(保留堆栈完整性和上下文):
try {
// 可能抛异常的代码
} catch (IOException e) {
logger.error("文件读取失败,路径:{}", filePath, e); // e 直接传入
}- ❌ 错误写法(丢失堆栈、破坏结构、绕过日志框架):
logger.error("文件读取失败,路径:" + filePath + ",异常:" + e); // 字符串拼接,无堆栈
e.printStackTrace(); // 输出到 System.err,不受 Logback 控制确保日志配置支持堆栈输出
Logback 默认就支持打印堆栈,但需确认 layout 配置未禁用或截断。推荐使用 %ex 或 %xEx 转换词(对应 Throwable.toString() 和完整堆栈)。
- 典型
logback.xmlpattern 示例:
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%ex%n</pattern>-
%ex:输出异常堆栈(默认只在有异常时生效) -
%xEx:输出带嵌套异常(caused by)的完整堆栈 - 避免只写
%m(仅消息)而漏掉%ex,否则堆栈不会出现
区分 error 和 warn,按需记录堆栈
不是所有异常都需要全量堆栈。业务可预期的异常(如参数校验失败),用 warn + 简洁提示即可;系统级、不可恢复的异常(如 DB 连接中断、NPE),必须用 error + 完整 Throwable。
- 例如参数非法:
} catch (IllegalArgumentException e) {
logger.warn("API 参数错误:{},原因:{}", request.getId(), e.getMessage());
}- 例如数据库操作失败:
} catch (SQLException e) {
logger.error("订单插入数据库失败,订单号:{}", orderNo, e);
}进阶:补充 MDC 上下文提升可追溯性
在 catch 前将关键业务字段(如 traceId、userId、reqId)放入 MDC,能让堆栈日志天然携带上下文,排查问题更高效。
- 示例:
try {
MDC.put("traceId", request.getTraceId());
MDC.put("userId", user.getId().toString());
// ... 业务逻辑
} catch (Exception e) {
logger.error("支付处理异常", e); // 日志自动含 traceId 和 userId
} finally {
MDC.clear();
}- 配合 pattern 中的
%X{traceId}即可输出
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











