从文本到结构化

原始日志长什么样

采集到日志之后,下一步是让日志变得可理解。原始日志往往是这样的:

2026-03-31 02:14:08 ERROR pay callback failed order=882317 cost=2300ms err=timeout

人能读懂,但系统很难稳定地统计和关联:

  • 「pay callback failed」是自由文本,没法直接过滤。
  • order=882317、cost=2300ms 埋在字符串里,没法聚合。
  • 不同团队写的错误信息五花八门,没法统一。

解析的目标

日志解析的目标是把它变成结构化事件:

{
  "time": "2026-03-31 02:14:08",
  "level": "ERROR",
  "service": "payment-service",
  "event": "pay_callback_failed",
  "order_id": "882317",
  "cost_ms": 2300,
  "err": "timeout",
  "message": "pay callback failed"
}
  • level、service 可以过滤。
  • order_id、cost_ms 可以聚合和排序。
  • trace_id 可以关联上下游。

结构化后能做什么

按 level 过滤      -> 只看 ERROR
按 service 过滤    -> 只看支付服务
按 order_id 聚合   -> 某个订单的所有日志
按 cost_ms 排序    -> 找出最慢的请求
按 trace_id 关联   -> 还原一次完整请求

一句话

日志解析的本质:把自由文本变成字段。人能读懂不代表系统能处理,结构化是查询、聚合、关联的前提。