日志格式与字段规范

做日志分析,第一道坎是什么?

不是告警规则怎么写,也不是监控平台怎么搭。

而是——日志本身。

我见过太多团队,工具买了一大堆,结果日志格式五花八门,连时间戳都统一不了。分析根本没法往下做。说白了,日志格式是分析的起点,也是告警的基石。

这一章,我们就来把这块基石打牢。

标准字段三件套:时间戳、级别、消息体

「核心字段」看起来简单,但坑特别多。我先把三件套列出来:

字段 作用 常见坑
时间戳 记录事件发生的精确时刻 精度不足、时区混乱、格式不统一
日志级别 标识事件严重程度(INFO/WARN/ERROR) 级别滥用、自定义级别无标准
消息体 事件的具体描述 信息不完整、包含敏感数据、过长

时间戳:第一道坑

我个人的习惯是,一律用Unix时间戳(毫秒级)存到日志里。为什么?因为它不带时区歧义。

举个例子:

我曾经踩过一个坑:

有一次做跨机房链路分析,A机房用"2024-03-15 14:23:10",B机房用"2024-03-15T14:23:10+08:00"。两条日志时间差恰好8小时,排查了一下午才发现是时区问题。

所以,建议统一成这种格式:

2024-03-15T06:23:10.456Z  // ISO 8601 + 毫秒 + UTC
或者
1710483790456             // 毫秒级Unix时间戳

如果你用了机器可读的格式,那后续的时序分析、聚合查询会顺手很多。嗯,这里要注意,文本格式一定要固定,不要今天用"yyyy-MM-dd",明天用"dd/MM/yyyy"。

日志级别:别乱用

级别是告警的第一触发信号。我的经验是,团队内部必须有个级别定义表:

级别 含义 触发场景
FATAL 系统不可用,必须立即介入 数据库连接池耗尽、关键节点崩溃
ERROR 功能异常,需人工处理 消息发送失败、MQ连接断开
WARN 非正常状态,但系统可自愈 重试超过3次、响应时间超阈值
INFO 常规操作记录 消息发送成功、通道建连完成
DEBUG 调试用,生产环境禁止高频输出 某变量的值、某分支的走向

我记得有一次,研发同学把所有异常都打成了INFO,理由是"ERROR太难看"。结果告警根本触达不到。你想想看,日志级别如果自己骗自己,那分析就是瞎子摸象。

消息体:结构化才是王道

消息体是最容易「放飞自我」的字段。有些人写长句子,有些人只写一个"成功"。这都不行。

我推荐采用键值对格式:

[IM通道] 消息发送失败 | channel=wechat | msgId=abc123 | 
errorCode=40005 | retryCount=2 | duration=1203ms

这样写的好处很明显:

  • 后续解析时直接按key提取
  • 相同维度的值可以做聚合(比如统计"errorCode=40005"出现了多少次)
  • 方便做搜索和过滤

自定义字段归纳总结

标准字段之外,每个团队都会有业务自定义字段。我见过最乱的日志,一条日志里塞了30多个不重复的键。

怎么治?我的做法是:归类。

类别 字段举例 说明
标识类 msgId, sessionId, traceId 用于链路追踪和去重
性能类 duration, memoryUsage, qps 系统健康度监控
错误类 errorCode, errorMsg, stackTrace 故障定位
业务类 channel, targetUser, msgType 业务维度分析

我个人的经验是,一个通道日志的自定义字段不要超过10个。超过了,说明日志这层做过度了,该另建事件表。

字段规范最佳实践

最后,我给一个贴在我工位上的清单:

  1. 时间戳用UTC+毫秒,不要用本地时间
  2. 日志级别严格遵守定义,别混用
  3. 消息体必须包含「发生了什么事 + 关键上下文」
  4. 自定义字段统一命名风格(我习惯用 camelCase)
  5. 敏感信息(手机号、密码)用掩码处理,不要明文
  6. 每条日志控制在一行内,不要有换行(不然解析时头大)

核心观点:

日志是分析的血肉,字段是骨架。骨架歪了,肉再多也立不起来。

好,字段规范就讲到这里。标准字段打好底,自定义字段归纳好,你这套日志体系的根基就算稳了。

日志格式与字段规范 · 知识体系 日志格式与字段 标准字段三件套 时间戳 UTC+毫秒 日志级别 严格定义 消息体 结构化键值对 自定义字段归纳 标识类 traceId 性能类 duration 错误类 errorCode 业务类 channel 字段规范最佳实践 时间戳统一UTC+毫秒 自定义字段不超过10个 敏感信息做掩码处理 每条日志控制在一行内 核心原则 日志是分析的血肉,字段是骨架 — 骨架歪了,肉再多也立不起来