真正提升线上排查效率的日志是结构清晰、上下文完整、级别合理、可追溯、易检索的“故障线索图”,需统一JSON或固定字段格式,强制包含时间戳、线程名、级别、类/方法名、TraceID,并精准分级(WARN记业务异常、ERROR记系统异常)、全链路透传TraceID、关键路径主动埋点、日志质量纳入监控。

日志不是记流水账,而是写“故障线索图”。真正提升线上排查效率的日志,关键在结构清晰、上下文完整、级别合理、可追溯、易检索——不是写得越多越好,而是每条日志都能回答“谁、在什么时间、做了什么、出了什么问题、关联哪些请求”。
统一结构化输出,让日志能被机器读懂
避免杂乱的System.out.println()或手拼字符串。用 Logback/Log4j2 配置 JSON 或带固定字段的文本格式,例如:
- 必须包含:时间戳、线程名、日志级别、类名/方法名、TraceID(通过 MDC 注入)
-
推荐模板(Logback):
%d{ISO8601} [%thread] %-5level %logger{36}.%method - %X{traceId} | %msg%n - 上线前检查所有服务是否启用该配置,确保 ELK/Loki 等系统能自动解析 traceId、level、duration 等字段
精准控制日志级别,别让关键信息被淹没
INFO 不是“默认兜底”,ERROR 也不是“万能垃圾桶”。生产环境应遵循最小必要原则:
- 用户登录失败、支付超时、缓存穿透等业务异常 → 记 WARN,含 username、orderId、errorCode
- 空指针、数据库连接中断、第三方接口 5xx → 记 ERROR,且必须带完整异常对象(
logger.error("DB query failed", e)) - DEBUG 只用于临时诊断,通过动态 API(如
/log-level?level=DEBUG)开启,查完即关,不重启服务
绑定请求全链路,跨服务也能一查到底
微服务中一次调用可能经过网关、订单、库存、风控多个节点。没有 TraceID,等于断案没编号:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 入口处生成唯一 traceId(如 UUID),存入 MDC:
MDC.put("traceId", id) - Feign/OkHttp/Ribbon 等客户端自动透传 header 中的 traceId 到下游
- 所有日志自动携带该字段,Kibana 中输入 traceId 即可串联整条链路日志
- 配合 SkyWalking 或 Pinpoint,还能叠加 JVM 指标交叉验证
主动埋点关键路径,把“可能出错”变成“一定留痕”
别等报错才看日志。对高危、慢速、核心路径做显式标记:
- 方法入口/出口打点:
log.debug("enter getOrderDetail, orderId={}", orderId)+log.debug("exit getOrderDetail, cost={}ms", duration) - 条件分支记录实际走哪条:
if (useCache) { log.debug("hit cache for key={}", key); } else { log.debug("miss cache, fallback to DB"); } - 慢 SQL、远程调用、大对象序列化等操作,记录耗时与参数摘要(脱敏后)
不复杂但容易忽略:日志本身是代码的一部分,要像写业务逻辑一样评审、测试、监控——比如定期检查 ERROR 日志突增、traceId 缺失率、JSON 格式错误率。日志质量上去了,90% 的线上问题,3 分钟内就能定位到具体类和行号。

















