常见日志格式:Syslog、JSON、Apache Common Log

日志格式这事,说大不大,说小不小。我刚入行那会儿,觉得日志只要能看就行,什么格式无所谓。结果呢?有一次线上查问题,系统出了一堆乱码日志,我盯着屏幕看了半小时,愣是没找到关键信息。从那以后,我算是明白了——日志格式选不好,后面解析全靠猜。

这一节,我就把工作中最常碰到的三种日志格式给你捋一遍。嗯,主要是 Syslog、JSON 和 Apache Common Log。这三种覆盖了系统日志、应用日志和 Web 服务器日志,搞懂了它们,大部分场景你都能应对。

常见日志格式对比结构图 日志产生源 Syslog PRI + HEADER + MSG RFC 5424 / RFC 3164 JSON {@timestamp, level, msg} 结构化,易解析 Apache Common Log host ident authuser [date] "request" status bytes 日志解析引擎 模式匹配 → 字段提取 → 统一存储 💡 不同格式适用于不同场景,了解其结构是自动化解析的关键

Syslog

Syslog 算是系统日志的“老前辈”了。从路由器、交换机到 Linux 服务器,它几乎无处不在。它的格式嘛,分两个版本:老的 RFC 3164 和新的 RFC 5424。我个人建议,新项目直接用 RFC 5424,字段更清晰。

一条典型的 Syslog 长这样:

<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8

拆解一下:

  • <34>:PRI,由 facility × 8 + severity 计算得来。说白了就是设备类型+日志级别。
  • Oct 11 22:14:15:时间戳,注意不带年份,这是个坑。
  • mymachine:主机名。
  • su::进程名或标签。
  • 后面就是消息正文了。
⚠️ 我曾经踩过的坑: 不同设备的时间戳格式可能不一样——有的用“Oct 11”这种英文缩写,有的用“10-11”,还有的干脆用 ISO 8601。解析时最好先做统一转换。

JSON 日志

JSON 日志是目前应用日志的主流。为什么呢?你想想看,Syslog 那串字符串,解析起来还得靠正则,头大。JSON 直接给你把字段分好了,取值就一行代码的事。

一个标准的 JSON 日志样例:

{
  "@timestamp": "2025-03-08T12:34:56.789Z",
  "log.level": "ERROR",
  "message": "Database connection timeout",
  "service.name": "user-api",
  "error.stack_trace": "java.sql.SQLTimeoutException: ..."
}

字段设计上,我习惯遵循 Elastic Common Schema (ECS) 的命名规范。比如 @timestamp 表示时间,log.level 表示级别,service.name 表示服务名。项目大起来之后,统一字段名比什么都重要。

💡 我的小技巧: 在打印 JSON 日志时,注意把 message 字段放在最后,因为如果它很长,解析库可能会被截断。而且尽量一行一条,不要多行 JSON,不然日志切割会很痛苦。

Apache Common Log

Apache 的日志格式,专门为 HTTP 访问日志设计的。Common Log 格式(CLF)是基础版,Combined Log Format 加了 Referer 和 User-Agent,更全面。不过核心还是那套东西。

一条 Apache 访问日志:

192.168.1.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

每个字段的含义:

  1. 192.168.1.1:客户端 IP。
  2. -:ident 协议,通常用横线表示未启用。
  3. frank:通过 HTTP 认证的用户名,没有就是 -。
  4. [10/Oct/2000:13:55:36 -0700]:请求时间,时区敏感。
  5. "GET /apache_pb.gif HTTP/1.0":请求方法、URI、协议。
  6. 200:状态码。
  7. 2326:返回字节数(不含响应头)。

如果你用 Combined 格式,后面还会多两列:"http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I)"。解析的时候注意引号内的内容要当成一个整体。

三种格式快速对比

特性SyslogJSONApache Common Log
结构化程度半结构化结构化半结构化
可读性中等好好(需熟悉各字段顺序)
解析难度中(正则匹配)低(JSON 库直接抽)中(正则 + 字段拆分)
常见场景网络设备、系统日志应用服务、微服务Web 服务器
字段扩展性差(只能追加到 MSG)好(任意加键值对)差(需修改 LogFormat)

选格式的时候,我的原则是:能用 JSON 就别用别的。但如果你的环境是老旧网络设备,那只能认 Syslog。Apache 日志嘛,跑不了,直接用现成的 Logstash 或 Fluentd 解析就好。

重点总结

  • Syslog 关注 facility/severity 和时间戳,小心时区和不规范设备。
  • JSON 日志推荐 ECS 标准,@timestamp 和 log.level 是必备字段。
  • Apache 日志的字段顺序固定,解析时注意引号和方括号内的内容。
  • 不管哪种格式,原始日志一定要保留,万一解析出错了还能回溯。