第2章 日志基础概念:日志类型、格式、级别

聊日志之前,我先问个问题:你觉得日志到底是什么?

说白了,日志就是系统运行过程的“黑匣子”。每一条记录都告诉我们系统在某个时间点干了什么、谁干的、结果如何。我刚开始搞安全那会儿,觉得日志就是调试用的,出问题了才翻一翻。后来被攻击者教做人,才知道——嗯,不打好日志基础,安全运维就是闭眼开车。

这一章,我们把日志的底层概念掰开揉碎。你理解了类型、格式、级别这三个维度,后面讲采集、解析、审计才能顺起来。

2.1 日志的三大来源

从SaaS安全视角看,日志主要来自三个层面。我习惯把它们画成一个三角形:

日志基础概念知识结构图 日志基础概念三维度 日志类型 Syslog / JSON / Apache 日志格式 W3C / CEF / LEEF / 自定义 日志级别 DEBUG ~ EMERGENCY 日志核心要素 时间戳 · 来源 · 级别 · 消息体 采集 → 解析 → 存储 → 审计 统一:时间戳对齐 / 格式归一 / 级别映射 理解这三者关系,就能快速判断一条日志该不该采、怎么采、采完怎么用

你可能会问,知道这些有什么用?我给你举个例子——

假设你公司用了云CRM和内部OA。CRM产生Syslog格式的操作日志,OA自己写JSON格式。如果你不了解格式差异,直接拿同一条规则去解析,一半数据会变成乱码。我最早踩过的坑就是这个。

2.2 日志类型

日志类型按来源分,主要有以下几种。我把它们列了个对照表,配合我实际见过的场景:

类型典型协议/格式特征我遇到的场景
系统日志 (Syslog)RFC 5424 / RFC 3164UDP传输、结构化、级别标签早期防火墙、Linux服务器默认输出
Web服务器日志W3C Extended / NCSA时间戳、请求方法、状态码、URLNginx/Apache,分析攻击路径常用
应用日志JSON / Log4j / Logback层级化、可自定义字段Java微服务最爱,字段自由但解析麻烦
数据库日志Audit Trail / Binary Log事务记录、模式变更、用户查询MySQL的general_log慢查询审计
云平台日志CloudTrail / Azure MonitorAPI调用、资源变更、IAM操作SaaS厂商的标准安全数据源

我的做法:在搭建日志平台前,先把所有数据源按上表分类画一遍。分类清楚了,采集配置就不会遗漏。我习惯用颜色标签区别:红标为安全必需,黄标为可选审计,绿标为辅助诊断。

2.3 日志格式

格式直接决定了你能不能解析。我见过最离谱的情况:某SaaS平台说支持日志导出,结果导出来是……自己定义的二进制格式,连官方文档都只有半页描述。嗯,这就是典型的不遵循标准。

2.3.1 标准格式 CEF 与 LEEF

CEF(Common Event Format)和LEEF(Log Event Extended Format)是安全圈比较通用的。两者结构类似,都是 Header + Extension 的模式:

// CEF 格式示例
CEF:0|Security|threatmanager|1.0|100|detected a threat|10|src=10.0.0.1 dst=10.0.0.2 msg=malware.exe

// LEEF 格式示例
LEEF:1.0|Security|threatmanager|1.0|100|devTime=2024-03-15T10:00:00Z src=10.0.0.1 dst=10.0.0.2 msg=malware.exe

我个人更倾向于CEF,生态更成熟,大部分SIEM原生支持。LEEF在IBM QRadar场景中更常见。

2.3.2 JSON 与 XML

JSON现在几乎是事实标准。它天然支持嵌套结构,对于现代SaaS应用来说非常友好。但要注意:有的厂商把JSON当普通文本发送,连换行都不加。我遇到过一条日志有25层嵌套,解析器直接爆栈。

重要提醒:JSON日志中的时间戳字段名和时区格式不统一(有UTC、+8、Unix时间戳),必须做归一化处理,否则排序关联会乱。

// 良好结构的JSON日志
{
  "timestamp": "2024-03-15T10:00:00.000Z",
  "event_id": "AUTH-001",
  "user": "zhangsan@company.com",
  "action": "login",
  "source_ip": "10.0.0.1",
  "result": "success"
}

// 不规范的JSON日志(我碰到过的真实情况)
{
  "time": "2024/03/15 18:00:00",
  "user": "zhangsan",
  "op": "login success from 10.0.0.1"
}

XML格式现在用得少了,但在某些金融SaaS中还在用。我刚开始处理Windows Azure日志时也被这个结构折腾过。它虽然结构化严谨,但解析开销比JSON大几个数量级。生产环境中,我不推荐过度使用XML。

2.3.3 自定义格式

这是最让人头大的类型。有些SaaS厂商为了“轻量化”,自己定义一行文本的日志。比如:

2024-03-15 10:00:00|LOGIN|zhangsan|10.0.0.1|Y
2024-03-15 10:01:23|LOGOUT|zhangsan|10.0.0.1|Y

看起来简单,但解析规则全靠猜。我踩过最深的一个坑是:某厂商用“|”分隔字段,但字段内容里也包含“|”,没有转义。那段时间我熬了三个通宵手写正则替换……现在想起来还头皮发麻。

建议:如果你在选型SaaS产品,优先看它是否支持导出CEF、JSON格式的日志。不支持的话,尽量要求二次加工流程。不要轻信“我们日志格式很简单”这种话。

2.4 日志级别

日志级别的重要性,我有个血泪史:有一次排查线上故障,发现所有日志都是INFO级别,根本找不到错误线索。后来发现:部分老系统没有正确对接日志级别接口,全部写死为INFO。

目前绝大多数系统遵循 RFC 5424 的标准,把级别分为8个等级:

级别编号级别名称典型含义在安全场景中的用法
0EMERGENCY系统不可用审计链路完全中断,需立即响应
1ALERT需要立即处理检测到暴力破解峰值、泄露
2CRITICAL严重错误数据库被删表、IAM配置被恶意修改
3ERROR错误事件请求鉴权失败、敏感数据泄露尝试
4WARNING警告事件异常用户行为、非正常时间段登录
5NOTICE重要信息配置变更、权限提升、新建管理员
6INFO普通信息用户登录、API调用、数据导出
7DEBUG调试信息开发环境才开启,生产环境原则上关闭

你可能会问:真的有人从0到7都配置一遍吗?

我的经验是:大部分生产环境只开放 WARNING、ERROR、CRITICAL、ALERT、EMERGENCY 这几个。NOTICE 可开可不开,INFO 作为审计补充。DEBUG 绝不能在生产打开——I/O开销大且泄露太多内部细节。

实战建议:开日志之前,先跟开发和运维对齐级别映射表。我自己维护了一份标准映射模板,每次引入新系统都用它核一遍,避免后期重新爬日志。

2.5 小结一下

日志类型告诉你去哪里找数据,日志格式告诉你数据长什么样,日志级别告诉你要多重视这个数据。三者环环相扣,缺一个环节都会导致安全事件漏报或误报。

我写了个简单的检查清单,每接到一个新SaaS系统,先跑一遍:

  • 类型检查:是Syslog、JSON还是自定义?是否需要协议转换?
  • 格式检查:时间戳是否带时区?嵌套层级多深?分隔符有无转义?
  • 级别检查:系统是否真实输出多个级别?级别值与RFC 5424是否对齐?
  • 兼容性检查:能否被现有SIEM或日志平台直接采集?解析模板是否存在?

把这些搞清楚,后面的章节你跟着走就会很顺利。千万别像我当初一样,日志拉了一堆,才发现格式和级别对不上,一堆白干。