常见日志格式:Syslog、JSON、Apache Common Log
日志格式这事,说大不大,说小不小。我刚入行那会儿,觉得日志只要能看就行,什么格式无所谓。结果呢?有一次线上查问题,系统出了一堆乱码日志,我盯着屏幕看了半小时,愣是没找到关键信息。从那以后,我算是明白了——日志格式选不好,后面解析全靠猜。
这一节,我就把工作中最常碰到的三种日志格式给你捋一遍。嗯,主要是 Syslog、JSON 和 Apache Common Log。这三种覆盖了系统日志、应用日志和 Web 服务器日志,搞懂了它们,大部分场景你都能应对。
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::进程名或标签。
- 后面就是消息正文了。
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 表示服务名。项目大起来之后,统一字段名比什么都重要。
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
每个字段的含义:
- 192.168.1.1:客户端 IP。
- -:ident 协议,通常用横线表示未启用。
- frank:通过 HTTP 认证的用户名,没有就是 -。
- [10/Oct/2000:13:55:36 -0700]:请求时间,时区敏感。
- "GET /apache_pb.gif HTTP/1.0":请求方法、URI、协议。
- 200:状态码。
- 2326:返回字节数(不含响应头)。
如果你用 Combined 格式,后面还会多两列:"http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I)"。解析的时候注意引号内的内容要当成一个整体。
三种格式快速对比
| 特性 | Syslog | JSON | Apache Common Log |
|---|---|---|---|
| 结构化程度 | 半结构化 | 结构化 | 半结构化 |
| 可读性 | 中等 | 好 | 好(需熟悉各字段顺序) |
| 解析难度 | 中(正则匹配) | 低(JSON 库直接抽) | 中(正则 + 字段拆分) |
| 常见场景 | 网络设备、系统日志 | 应用服务、微服务 | Web 服务器 |
| 字段扩展性 | 差(只能追加到 MSG) | 好(任意加键值对) | 差(需修改 LogFormat) |
选格式的时候,我的原则是:能用 JSON 就别用别的。但如果你的环境是老旧网络设备,那只能认 Syslog。Apache 日志嘛,跑不了,直接用现成的 Logstash 或 Fluentd 解析就好。
重点总结
- Syslog 关注 facility/severity 和时间戳,小心时区和不规范设备。
- JSON 日志推荐 ECS 标准,
@timestamp和log.level是必备字段。 - Apache 日志的字段顺序固定,解析时注意引号和方括号内的内容。
- 不管哪种格式,原始日志一定要保留,万一解析出错了还能回溯。