验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

异常日志怎么打印才好

阅读:634 来源:乙速云 作者:代码code

异常日志怎么打印才好

异常日志打印得好不好,直接影响排查效率系统可维护性。下面从原则、格式、示例、常见坑几个方面系统讲一下。


一、异常日志的核心目标

✅ 让人一眼能定位问题
✅ 能知道谁、在哪、为什么出错
✅ 不丢上下文、不泄露敏感信息
✅ 方便告警、聚合、追踪


二、异常日志必须包含的信息

✅ 基础信息(缺一不可)

  • 时间
  • 日志级别(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 / 云厂商

我可以直接给你一份可复制的最佳实践模板

分享到:
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>