关键业务指标日志需结构化、可采集、可告警,包含业务标识、状态快照、耗时分解、决策依据、异常标记五类字段,结合mdc、json输出、aop注解与监控系统联动实现低侵入实时指标采集。

在系统核心节点记录关键业务指标,不是简单打几条 info 日志就行,而是要让日志本身成为可采集、可聚合、可告警的结构化数据源。重点在于指标语义明确、上下文完整、输出可控、不干扰主流程。
关键业务指标该记哪些内容
核心节点(如订单创建、支付回调、库存扣减)的日志必须包含以下五类字段:
- 业务标识:订单号、用户ID、商户号等——用于关联追踪和分维度统计
- 状态快照:当前操作前/后的关键状态值(如“库存余额:127→126”、“订单状态:created→paid”)
- 耗时分解:总耗时 + 子环节耗时(DB查询 18ms、Redis校验 5ms、MQ投递 3ms)
- 决策依据:影响结果的关键条件(如“跳过风控:userLevel=VIP”、“触发熔断:失败率>80%”)
- 异常标记:非Exception类问题也需显式标注(如“warn: 库存预占超时,降级走最终一致性”)
使用结构化日志 + MDC 增强上下文
避免拼接字符串,统一用 JSON 输出,并借助 MDC(Mapped Diagnostic Context)注入跨方法的公共上下文:
// 在入口处(如Controller或Filter)注入
MDC.put("traceId", generateTraceId());
MDC.put("orderId", orderId);
MDC.put("userId", userId);
// 在核心逻辑中记录指标
logger.info("{\"event\":\"order_paid\",\"orderId\":\"{}\",\"userId\":\"{}\",\"amount\":{},\"stockDeductMs\":{},\"status\":\"success\"}",
orderId, userId, amount, stockCostMs);
Logback 配置中启用 JSON encoder(如 logstash-logback-encoder),确保日志可被 ELK 或 Loki 直接解析为字段。
用 AOP + 自定义注解实现低侵入指标埋点
对关键方法加注解,自动记录入参、出参、耗时、异常,但不记录敏感字段(如银行卡号、密码):
@LogBusinessMetrics(bizType = "payment", includeParams = {"orderId", "amount"}, excludeParams = {"cardNo"})
public PaymentResult pay(String orderId, String cardNo, BigDecimal amount) { ... }
切面内部做脱敏处理(如 cardNo.replaceAll(".{4}$", "****")),并把指标组装成标准 JSON 发送到异步 Appender。
指标日志与监控系统联动
- 日志中固定字段
event(如"event":"inventory_deduct")作为指标分类标签 - 用 Logstash 或 Filebeat 提取
costTime、status、code等字段,写入 Prometheus 的 Pushgateway(通过/metrics/job/java-logs推送) - Grafana 中配置 P95 耗时看板、失败率趋势图、按
bizType维度的调用量 TopN
这样,一条日志既是排障线索,也是实时指标源,无需额外埋点代码或 SDK。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











