2. 日志基础:分类与格式——先搞清楚你的对手长什么样
说到日志巡检,很多人上来就找工具,选方案。但我得说句实话:先花点时间搞明白日志本身,比什么都重要。你连日志从哪来、长什么样都不清楚,工具选了也是白搭。
这一章,我们就来把日志的“底裤”扒干净。聊聊日志怎么分类,又有哪些常见的格式。
2.1 日志的三大门派:应用、系统、安全
我个人习惯把日志分成三类。这个分类不是理论派的玩法,是我在项目里撞了无数次墙之后总结出来的。你一旦分清楚,后续的采集、过滤、告警策略就清晰多了。
| 日志类别 | 核心来源 | 典型特征 | 巡检关注点 |
|---|---|---|---|
| 应用日志 | 业务系统、中间件、数据库 | 格式最乱,内容最杂,条数最多 | 错误栈、请求耗时、业务异常 |
| 系统日志 | 操作系统、内核、硬件驱动 | 记录系统级事件,有标准通道(如 syslog) | 磁盘I/O、内存告警、内核报错 |
| 安全日志 | 防火墙、WAF、认证服务、审计系统 | 时间敏感,通常包含IP、用户、动作 | 暴力破解、越权操作、异常登录 |
我的实战感受: 千万不要把应用日志和系统日志混在一起处理。我曾见过一个团队把所有日志都丢到同一个索引里,结果排查问题时,先要在几十万条健康检查日志里翻找真正的业务错误——那感觉就像大海捞针,效率极低。
一个小建议: 在设计日志采集流水线时,至少要给三类日志分别打上不同的标签(tag)。这个习惯能让你后续的检索和告警配置省下80%的力气。
2.1.1 应用日志
应用日志,说白了就是你想让它写什么,它就写什么。灵活性极高,但坑也最多。
我见过最夸张的一次,某业务系统把4MB的图片base64编码后直接塞进了日志文件。嗯,你想想看,光那一条日志就占了4MB。当时负责巡检的ELK集群直接就OOM了。
经验之谈: 应用日志必须有规范。开发团队和运维团队最好坐在一起,约定好日志级别(DEBUG/INFO/WARN/ERROR),以及关键字段的命名。别让程序员的 console.log 成为你的噩梦。
2.1.2 系统日志
系统日志比较“老实”。它通常遵循标准协议(比如 syslog)或者系统固定的输出格式。
在Linux上,你只要盯着 /var/log/messages、/var/log/syslog 以及 dmesg 的输出就差不多了。Windows则主要是 Event Log。
我记得有一次线上数据库服务器突然卡顿,大家排查了半天无果。我随手翻了翻 /var/log/messages,发现有一条“I/O error”反复出现,时间点正好和业务抖动吻合——原来是一块磁盘的 SATA 线松了。这种事,应用日志是永远不可能告诉你的。
2.1.3 安全日志
安全日志可能是最容易被忽略的。
大部分公司只在被攻破之后才想起来看安全日志。但我告诉你,安全日志是“事后诸葛亮”最好的工具。它能帮你还原攻击路径,也能帮你定位内部人员的违规操作。
我曾经帮一个客户做审计,发现某个员工在凌晨3点连续登录了5台服务器。安全日志记录了 IP、认证方式、操作命令——整个“犯罪”过程一目了然。这要是没有安全日志,你就只能看着审计报告干瞪眼。
2.2 日志的“脸面”:三种主流格式
日志格式决定了工具该怎么解析它。选对格式,解析器的性能能差5-10倍。
2.2.1 JSON 格式
描述: 结构清晰,字段名和值成对出现。机器解析的最爱。
优点:
- 无需手动切分字段,天生自带 schema
- 支持嵌套结构(如
{"user": {"name": "张三", "id": 123}}}) - 大部分现代工具(ELK、Loki、ClickHouse)原生支持
缺点:
- 体积大。同样的内容,JSON 可能是纯文本的 3-5 倍
- 人类阅读友好度不高(如果没格式化的话)
{
"timestamp": "2025-03-19T14:30:00.123Z",
"level": "ERROR",
"service": "user-service",
"message": "用户登录失败",
"user_id": "u_10086",
"error_code": "AUTH_FAILED"
}
2.2.2 Syslog 格式
描述: 最古老的“长老级”格式。RFC 3164 和 RFC 5424 两个标准。
优点:
- 成熟、稳定。几乎所有网络设备、Unix/Linux 系统都支持
- 传输效率高,适合低带宽场景
缺点:
- 字段固定且有限(优先级、时间戳、主机名、消息体)
- 非结构化。想要提取 IP、用户ID 之类的字段,必须用正则或 grok 解析
<14>1 2025-03-19T14:30:00.123Z server01 sshd - - - Failed password for root from 10.0.0.1 port 22
2.2.3 纯文本格式(无结构)
描述: 就是“一堆字”。通常是开发人员在程序里直接 print 出来的。
优点:
- 肉眼看起来最直观,适合临时排查
- 体积最小
缺点:
- 对工具极其不友好。 每次解析都要写复杂的正则表达式
- 一旦格式微调(比如多加了一个空格),正则就失效了
[2025-03-19 14:30:00] ERROR 用户登录失败, uid=u_10086
避坑指南: 我曾经接手过一个系统,它的纯文本日志里时间格式居然是 "Mar 19, 25 2:30 PM" 这种“美式写法”。你用日期解析工具去配,能配到怀疑人生。所以,如果你还在开发阶段,请务必优先使用 JSON 格式。纯文本格式,能不用就不用。
2.3 一张图看懂日志基础体系
下面这张图算是本章的一个小小总结。它清晰地展示了日志从产生到被采集工具识别之前的生命周期。我把它叫做“日志脸谱图”。
2.4 选型时的一个小提醒
我们做工具选型,第一步不是看工具支持多少种“花哨”的功能。而是先问自己三个问题:
- 我的日志主要是哪一类? 应用日志多,还是系统日志多?
- 日志是什么格式? 如果是清一色的 JSON,那大部分现代工具都能轻松驾驭。如果全是纯文本,那你得找正则解析能力强的工具。
- 日志量级有多大? 这个决定了工具的性能要求。后面我们会详细讲。
给初学者的建议: 不要一开始就追求“大一统”的日志平台。先从一个服务、一类日志开始练手。先搞定应用日志的 JSON 格式解析,再慢慢扩展到系统日志和安全日志。步子迈太大,容易扯到蛋。