日志格式化与标准化:Syslog、JSON、CEF 规范详解
说实话,我刚入行那会儿,日志长得千奇百怪。有的一行塞了上千个字符,有的连时间戳都没有。直到有一次,合规审计时对方丢给我一句:“你这日志格式不标准,没法自动解析。”……嗯,打那以后,我就把日志标准化当成头等大事。
这一节,咱们把三种主流格式——Syslog、JSON、CEF 掰开揉碎讲清楚。你想想看,只要搞懂这三个,市面上 90% 的安全设备日志,你都能一眼看穿。
Syslog 规范:老当益壮
Syslog 是经典中的经典。最早是 RFC 3164(BSD 风格),后来升级到 RFC 5424(结构化增强)。我处理过大量网络设备日志,思科、华为基本沿用 RFC 3164 变体,而新版 Linux 系统(如 rsyslog)默认走 5424。
| 特性 | RFC 3164 | RFC 5424 |
|---|---|---|
| 时间戳格式 | Mmm dd hh:mm:ss | ISO 8601 (yyyy-mm-ddT...) |
| 结构 | PRI + HEADER + MSG | PRI + 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
JSON 日志:现代首选
JSON 相比 Syslog 的优势很明显——自描述、易解析。现在的微服务、云原生环境几乎清一色用 JSON。
我建议至少包含这些字段:
timestamp– ISO 8601 格式,带时区level– info/warn/error/criticallogger或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"
}
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– 源目IPspt/dpt– 端口proto– 协议act– 动作(allow/block)cn1/cn2– 自定义数字字段
三种格式怎么选?
我画了一张对比图,帮你看清各自定位——
你看,Syslog 适合老旧网络设备,JSON 是现代化服务标配,CEF 则是安全圈的法宝。实际项目中,我经常要把 Syslog 转成 JSON,再统一灌入 Kafka;或者在 SIEM 前端做好 CEF 的字段映射。
我的工程建议:
- 如果设备只支持 Syslog 3164,写个简单的 cleanup 脚本,把时间戳规整成 ISO 格式。
- 新开发的应用一律输出 JSON,字段名用蛇形命名(snake_case),避免大小写问题。
- CEF 一定要留意扩展字段的类型,字符串要引起来?不,CEF 不用引号,但特殊字符必须转义。
嗯,最后提醒一下:标准是死的,场景是活的。别为了标准化而标准化,你的目标是让日志能被 自动解析 和 快速告警。搞清楚了这三个格式,再遇到什么 LEEF、GELF 也都能触类旁通。