日志格式化与标准化:Syslog、JSON、CEF 规范详解

说实话,我刚入行那会儿,日志长得千奇百怪。有的一行塞了上千个字符,有的连时间戳都没有。直到有一次,合规审计时对方丢给我一句:“你这日志格式不标准,没法自动解析。”……嗯,打那以后,我就把日志标准化当成头等大事。

这一节,咱们把三种主流格式——Syslog、JSON、CEF 掰开揉碎讲清楚。你想想看,只要搞懂这三个,市面上 90% 的安全设备日志,你都能一眼看穿。

Syslog 规范:老当益壮

Syslog 是经典中的经典。最早是 RFC 3164(BSD 风格),后来升级到 RFC 5424(结构化增强)。我处理过大量网络设备日志,思科、华为基本沿用 RFC 3164 变体,而新版 Linux 系统(如 rsyslog)默认走 5424。

特性RFC 3164RFC 5424
时间戳格式Mmm dd hh:mm:ssISO 8601 (yyyy-mm-ddT...)
结构PRI + HEADER + MSGPRI + VERSION + TIMESTAMP + HOSTNAME + APP-NAME + PROCID + MSGID + STRUCTURED-DATA + MSG
结构化数据无可选 [key="value"] 块
最大长度1024 字节(通常)2048 字节(推荐)

一个典型的 3164 日志长这样:

<14>Mar 25 09:00:01 myhost sshd[1234]: Failed password for root from 10.0.0.1 port 22

换成 5424 格式,清晰很多:

<14>1 2025-03-25T09:00:01.000Z myhost sshd 1234 - [meta sequenceId="789"] Failed password for root from 10.0.0.1 port 22
我的小经验: 做日志归一化时,先把时间戳统一成 ISO 8601。很多 SIEM 解析器对 3164 的月份缩写容易误判,比如“Mar”在非英语系统可能被当成乱码。

JSON 日志:现代首选

JSON 相比 Syslog 的优势很明显——自描述、易解析。现在的微服务、云原生环境几乎清一色用 JSON。

我建议至少包含这些字段:

  • timestamp – ISO 8601 格式,带时区
  • level – info/warn/error/critical
  • logger 或 source – 生成日志的组件
  • message – 人类可读描述
  • request_id – 链路追踪用

举个例子:

{
  "timestamp": "2025-03-25T09:00:01.123Z",
  "level": "ERROR",
  "logger": "auth.service",
  "message": "Login failed",
  "user": "admin",
  "source_ip": "10.0.0.1",
  "request_id": "abc-123-def"
}
避坑指南: 我曾经遇到过团队把嵌套 JSON 写到一行里,没有格式化。结果 SIEM 解析时 stack overflow。建议:生产环境日志可以压缩存储,但传输和解析时一定要保证 JSON 结构完整。

CEF(Common Event Format)

CEF 是 ArcSight(现在是 Micro Focus)推出的格式,在安全设备上用得特别多。它本质上是扩展的 Syslog,但通过 key=value 对支持结构化。

标准的 CEF 头部格式:

CEF:Version|Device Vendor|Device Product|Device Version|Signature ID|Name|Severity|[Extension]

一个防火墙日志的例子:

CEF:0|Check Point|FireWall-1|R80.40|accept|Allow inbound|Medium| src=10.0.0.1 dst=192.168.1.100 spt=54321 dpt=443 proto=tcp act=allow

扩展部分的关键字段:

  • src / dst – 源目IP
  • spt / dpt – 端口
  • proto – 协议
  • act – 动作(allow/block)
  • cn1 / cn2 – 自定义数字字段
要点: CEF 要求值里不能有等号和竖线,否则必须转义。我排查过一个被截断的日志,就是因为 IP 地址里莫名其妙多了个竖线符号。

三种格式怎么选?

我画了一张对比图,帮你看清各自定位——

日志格式标准化对比 Syslog (RFC 3164) JSON CEF • 传统网络设备 • 文本流,长度受限 • 解析依赖正则 • 兼容性最广 • 微服务/云原生 • 自描述结构 • 可嵌套对象 • 解析性能高 • 安全设备专用 • 键值对扩展 • 与 SIEM 深度整合 • 需要字段映射 统一原则:时间戳标准化 + 必选字段 + 转义规则 推荐在采集层统一转为 JSON,再送入解析引擎

你看,Syslog 适合老旧网络设备,JSON 是现代化服务标配,CEF 则是安全圈的法宝。实际项目中,我经常要把 Syslog 转成 JSON,再统一灌入 Kafka;或者在 SIEM 前端做好 CEF 的字段映射。

我的工程建议:

  • 如果设备只支持 Syslog 3164,写个简单的 cleanup 脚本,把时间戳规整成 ISO 格式。
  • 新开发的应用一律输出 JSON,字段名用蛇形命名(snake_case),避免大小写问题。
  • CEF 一定要留意扩展字段的类型,字符串要引起来?不,CEF 不用引号,但特殊字符必须转义。

嗯,最后提醒一下:标准是死的,场景是活的。别为了标准化而标准化,你的目标是让日志能被 自动解析 和 快速告警。搞清楚了这三个格式,再遇到什么 LEEF、GELF 也都能触类旁通。