为什么日志重要
指标告诉你"出问题了",日志告诉你"为什么"。
在排查线上问题时,日志往往是最直接、最有价值的证据来源。
结构化日志
非结构化:
2026-08-29 10:23:45 用户 zhangsan 登录失败人能读,但机器难以解析和检索。
结构化(如 JSON):
{
"timestamp": "2026-08-29T10:23:45+08:00",
"level": "WARN",
"event": "login_failed",
"user": "zhangsan",
"ip": "192.168.1.100",
"reason": "invalid_password"
}优势:可以被索引,支持结构化查询("找出所有 reason=invalid_password 且 ip 属于某个网段的记录"),也能做聚合分析。
日志级别
- ERROR:错误,需要关注(如请求失败、外部调用异常);
- WARN:警告,潜在问题(如重试成功、降级触发);
- INFO:正常运行的关键信息(如服务启动、重要状态变更);
- DEBUG:调试信息,生产环境通常关闭。
建议:
- 级别要有明确约定,不要所有东西都打 INFO;
- ERROR 应该是"需要有人处理"的,而不只是"出问题了"(如果 ERROR 太多,就没人看了)。
该记什么
一、请求标识(Trace ID / Request ID)
每个请求生成一个唯一 ID,贯穿整个处理过程(包括跨服务调用)。
有了它,就能把一次请求在所有服务中的日志串联起来——这是排查分布式系统问题的关键。
二、关键业务事件
下单、支付、发货、权限变更等。这些日志有时用于审计和业务分析。
三、外部依赖调用
调用时间、耗时、状态码、是否重试。
四、异常堆栈
但要小心:重复的堆栈会淹没日志。可以考虑聚合同类异常。
不该记什么
敏感信息——这是最重要的红线:
- 密码、令牌、密钥(即使加密后的也不应记录);
- 身份证号、手机号、银行卡号(除非必要且脱敏);
- 完整的信用卡信息。
为什么会出问题:很多人习惯性地打 log.info("request: " + request),而 request 对象中可能包含密码字段。
做法:
- 在日志框架层面配置脱敏规则;
- 对象的 toString 方法要避免输出敏感字段;
- 定期审查日志中的敏感数据(可用自动化扫描)。
日志的生命周期
采集:从应用输出到文件或标准输出,再由采集代理(如 Filebeat、Fluent Bit)收集。
传输:经过缓冲(如 Kafka)送到存储。
存储与索引:专用的日志系统(如 Elasticsearch、Loki)。
保留策略:日志量增长很快,需要分级保留:
- 热数据(最近几天):完整索引,可快速查询;
- 温数据(几周):压缩存储,查询较慢;
- 冷数据(数月到数年):归档到对象存储,满足合规要求,需要时再恢复。
两个实践建议
一、日志是给人看的,不是给自己看的。
写日志时想象:凌晨三点,另一个人拿着这条日志排查问题,他能看懂吗?他知道该怎么处理吗?
二、控制日志量。
日志过多会带来:存储成本、检索性能下降、噪音淹没关键信息。
在高频路径上打印日志要格外谨慎——一个每毫秒打一条的日志,很快就能填满磁盘。
说明:本文为可观测性实践的知识整理。