异常日志怎么打印才好
异常日志打印得好不好,直接影响排查效率和系统可维护性。下面从原则、格式、示例、常见坑几个方面系统讲一下。
一、异常日志的核心目标
✅ 让人一眼能定位问题
✅ 能知道谁、在哪、为什么出错
✅ 不丢上下文、不泄露敏感信息
✅ 方便告警、聚合、追踪
二、异常日志必须包含的信息
✅ 基础信息(缺一不可)
- 时间
- 日志级别(ERROR / WARN)
- 线程名
- 类名 + 方法名
- 异常类型
- 异常信息(message)
- 完整堆栈
✅ 业务上下文(非常重要)
- 关键业务 ID(orderId、userId、traceId)
- 输入参数(脱敏)
- 当前状态 / 步骤
三、推荐的异常日志格式(通用)
✅ 标准格式(强烈推荐)
[时间] [级别] [线程] [类名] - [业务描述] | context={} | exception=
✅ 示例(Java / Logback)
log.error(
"创建订单失败 | orderId={}, userId={}",
orderId, userId, e
);
✅ 输出效果:
2026-01-21 10:32:11.221 ERROR [http-nio-8080-exec-3] c.x.OrderService - 创建订单失败 | orderId=123, userId=456
java.lang.NullPointerException: orderPrice is null
at com.xxx.OrderService.create(OrderService.java:88)
⚠️ 注意:log.error("msg", e) ✅log.error("msg" + e) ❌(会丢堆栈)
四、不同场景的异常处理方式
1️⃣ 业务异常(可预期)
catch (OrderNotFoundException e) {
log.warn("订单不存在 | orderId={}", orderId, e);
}
✅ 用 warn
✅ 不需要告警
✅ 但要有上下文
2️⃣ 系统异常(不可预期)
catch (Exception e) {
log.error("系统异常 | orderId={}", orderId, e);
throw e;
}
✅ 用 error
✅ 保留堆栈
✅ 不要吞异常
3️⃣ 第三方调用失败
log.error(
"调用支付服务失败 | orderId={}, payType={}, response={}",
orderId, payType, response, e
);
✅ 打印:
- 入参
- 返回值
- 状态码
五、一定要避免的坑 ❌
❌ 1. 只打印 message
log.error("error: " + e.getMessage());
❌ 堆栈丢失,排查基本靠猜
❌ 2. 吞掉异常
try {
...
} catch (Exception e) {
log.error("error");
}
❌ 上层无法感知,问题被隐藏
❌ 3. 打印日志又抛异常但信息不一致
log.error("支付失败");
throw new RuntimeException("系统异常");
❌ 日志和异常对不上
✅ 应该:
throw new RuntimeException("支付失败", e);
❌ 4. 打印敏感信息
log.error("用户信息 | user={}", user);
❌ 密码、身份证、token 不能打
✅ 脱敏:
log.error("用户信息 | userId={}", user.getId());
六、进阶:让异常日志更好用
✅ 1. 使用 TraceId(强烈推荐)
[traceId=abc123] 创建订单失败
✅ 一个请求一条线
✅ 微服务必备
✅ 2. 日志结构化(JSON)
{
"time": "2026-01-21T10:32:11",
"level": "ERROR",
"service": "order-service",
"traceId": "abc123",
"msg": "创建订单失败",
"orderId": 123,
"exception": "NullPointerException"
}
✅ 适合 ELK / Loki / 日志平台
✅ 3. 异常分类 + 错误码
log.error("订单状态异常 | code={}, orderId={}", "ORDER_1001", orderId, e);
✅ 方便告警 & 定位
七、总结一句话
好的异常日志 = 能复现 + 能定位 + 不误报 + 不漏信息
如果你愿意,可以告诉我:
- 你用的是 Java / Python / Go / Node
- 是否 微服务
- 日志系统是 ELK / Loki / 云厂商
我可以直接给你一份可复制的最佳实践模板。