日志系统基础:日志类型、格式、采集、存储

做联邦审计,第一步就是搞懂日志从哪来、长什么样、怎么收、放哪儿。你别看这听起来基础,实际项目里很多人就是在这一步踩了坑,后面整个查询链路全崩。我记得有一次帮客户排查跨组织审计延迟,折腾了两天,最后发现是日志采集端的格式没对齐——唉,白白浪费了两天。

这一章我就把日志系统的四块核心掰开揉碎讲清楚。你理解透了,后续的跨组织查询才立得住。

日志类型

不同系统、不同组件输出的日志,用途差异很大。我一般把日志分成下面几类:

类型 说明 典型来源
应用日志 业务代码写出来的,记录业务事件、错误、调用链 Java应用、Python服务、微服务网关
系统日志 操作系统层面的日志 /var/log/syslog, Windows Event Log
安全日志 认证、授权、异常登录、权限变更 SSH登录记录、防火墙、WAF
审计日志 合规要求,记录谁在什么时间做了什么操作 数据库审计、文件访问审计、API操作日志
网络日志 流量、连接、DNS查询 路由器、交换机、LB
我的习惯:在联邦审计场景下,审计日志永远是核心,但应用日志往往能帮上大忙——很多时候业务异常先发生在应用层。

日志格式

日志格式的混乱程度,我估计你想象不到。光JSON就有几十种变体,Syslog还有不同的Facility和Severity。项目里我见过最离谱的是同一个组织内,三个系统用了三种时间格式……解析器的正则写了200行还没完全覆盖。

常见的格式对比:

格式 优点 缺点 适用场景
JSON 结构化,解析方便,易扩展 阅读性一般,长日志体积大 微服务、分布式系统
Syslog (RFC 5424) 标准协议,成熟生态 字段有限,非结构 网络设备、Linux系统
CSV/TSV 极简,体积小 不支持嵌套,转义麻烦 批量导出、传统BI
自定义文本 灵活,可读好 解析成本高,标准缺失 遗留系统、快速开发
Protocol Buffers 高性能,压缩比高 调试困难,Schema管理 高性能内部通道
我曾经踩过的坑:有一回做跨组织日志合并,A组织用ISO 8601时间,B组织用Unix时间戳,C组织用了YYYYMMDDHHMMSS……最后我不得不用正则把所有格式转成统一的毫秒时间戳。从那以后我定了个规矩:日志格式必须前置协商,时间精确到毫秒,时区统一UTC。

我建议你在联邦审计项目启动时,就要求所有参与方输出一份“日志格式声明”,至少包含:

  • 完整字段列表及类型
  • 时间戳格式(含时区)
  • 敏感字段脱敏规则(如IP、用户ID)
  • 必选字段(至少包含 event_id、timestamp、source_org、operation)

日志采集

采集方式决定你能拿到什么粒度的数据。常用的采集方案:

  1. Agent采集:在服务器上部署采集守护进程(Filebeat、Fluentd、Logstash)。支持文件尾随、元数据添加。
  2. Syslog转发:网络设备原生支持,通过TCP/UDP发到中央收集器。
  3. API/Webhook:应用主动推送到日志网关。适合云原生、Serverless。
  4. 数据库CDC:通过Binlog或WAL捕获变更日志。常用于审计表。
  5. 消息队列消费:从Kafka、RabbitMQ直接拉取日志流。

关键点:在联邦审计场景下,采集阶段就需要保留来源组织标识。我通常在采集侧就打上 org_id 标签,否则后面根本没法区分日志是谁的。

举个例子,用Filebeat采集应用日志并添加组织标签:

# filebeat.yml 配置片段
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    org_id: "org_a"
    env: "production"
  fields_under_root: true

output.elasticsearch:
  hosts: ["https://es-central:9200"]
  index: "audit-logs-%{+yyyy.MM.dd}"
小技巧:采集时尽量保持原始消息不丢字段,避免在Agent侧做复杂的结构化。复杂的解析放到后端的Logstash或Fluentd Pipeline里做,这样出问题时好回退排查。

日志存储

存储选型直接影响查询性能和数据保留策略。我见过太多人一把梭全塞ES,结果索引膨胀到月GB级,查询慢得像蜗牛。

常见的存储对比:

方案 查询性能 存储成本 水平扩展 适用数据量
Elasticsearch 全文搜索快,聚合慢 中等(副本开销) 易扩展 TB级
Loki 按Label查询快,无索引 低 容易 PB级
ClickHouse 分析聚合极快 低(列式压缩) 需分片 PB级
HDFS + Hive 批处理,实时性差 极低 天然 EB级
对象存储 (S3/MinIO) 不支持实时查询 最低 天然 无限
注意:跨组织查询场景下,数据分区策略至关重要。我建议至少按 org_id + 日期 做分区。另外,冷热分层必须做——近30天的日志放热存储,超过30天的自动迁移到对象存储。否则成本控制不住。

讲到这,我把这一章的知识体系画成一张图,你一看就明白:

日志系统基础架构 日志类型 • 应用日志 • 系统日志 • 安全/审计日志 • 网络日志 日志格式 • JSON • Syslog • CSV/TSV • 自定义/Protobuf 日志采集 • Agent采集 • Syslog转发 • API/Webhook • 消息队列 日志存储 实时查询型:Elasticsearch / Loki / ClickHouse 批量型:HDFS + Hive / Spark 归档型:对象存储 (S3 / MinIO / OSS) 核心思想 日志类型决定格式选择,格式影响采集策略,采集后的数据最终落到合适的存储层。 联邦审计要求全程保留组织标识 (org_id),并统一时间戳时区。

最后说一点我的体会:日志系统设计得像一个“管道”,每个环节都留好扩展点。日志类型可能新增,格式可能变更,采集方式会演进,存储方案也可能换。你只要把采集管道和存储模式松耦合,后面改起来才不会伤筋动骨。