3. 日志采集与聚合:日志来源、采集工具与存储

日志这东西,说白了就是系统的「黑匣子」。设备身份治理平台每天处理几百万甚至上千万的设备认证请求,一旦出问题,你连日志都找不到,那就真成了瞎子摸象。我这些年踩过的坑,十有八九都跟日志没管好有关。

这一章我们聊聊日志的三大块:从哪来(日志来源)、怎么收(采集工具)、存哪去(聚合与存储)。

日志采集与聚合架构 日志来源 系统日志 应用日志 安全日志 采集工具 Filebeat Logstash 聚合与存储 Elasticsearch 分布式存储 + 全文检索 💡 核心链路:日志来源 → Filebeat 轻量采集 → Logstash 解析过滤 → Elasticsearch 存储索引 每一层都有缓存和容错机制,保证日志不丢、不重、不乱。

3.1 日志来源:三类日志,缺一不可

设备身份治理平台的日志,我习惯分成三类:系统日志、应用日志和安全日志。这三者各有侧重,但缺了哪一个,排查问题时都会让你抓狂。

3.1.1 系统日志

系统日志记录的是操作系统和基础设施层面的信息。比如 CPU 飙高、磁盘写满、网络断连、内核报错等等。这些日志通常由 syslog、journald 或 Windows 事件查看器产生。

我在项目中遇到过好几次,设备认证突然大面积超时,查了半天应用日志啥问题没有,最后发现是系统日志里报「磁盘 I/O 等待时间超过 30 秒」。嗯,那台机器的 SSD 快挂了。所以系统日志一定要收,而且要设告警。

日志类型典型来源常见内容重要等级
系统日志/var/log/syslog, /var/log/messages内核信息、硬件错误、服务启停★★★★★
应用日志应用 stdout/stderr, 自定义日志文件请求耗时、业务异常、状态变更★★★★★
安全日志/var/log/auth.log, auditd, 安全设备登录失败、权限变更、异常访问★★★★★

3.1.2 应用日志

这是最核心的日志。设备身份治理平台的应用日志包括:设备注册请求、证书签发记录、身份认证结果、策略执行日志等等。每一笔设备身份的生命周期变更,都应该有对应的应用日志。

我个人习惯在应用日志里至少包含以下字段:时间戳、设备 ID、操作类型、请求来源 IP、处理结果、耗时。这样后期做链路追踪和性能分析才方便。

小技巧:应用日志建议使用 JSON 格式输出,而不是纯文本。JSON 结构化日志在 Elasticsearch 里可以直接解析字段,查询效率高得多。我见过太多团队还在用「空格分隔」的日志格式,每次查日志都要写正则,累死人。

3.1.3 安全日志

安全日志是合规审计的命根子。设备身份治理平台如果被攻破,安全日志就是最后的防线。安全日志包括:SSH 登录记录、sudo 执行记录、文件权限变更、防火墙拦截记录、以及平台自身的认证失败记录。

我曾经遇到过一个案例:某天突然发现大量设备证书被异常吊销。查安全日志发现,有人在凌晨 3 点用管理员账号登录了平台,而且登录 IP 来自境外。要不是安全日志保留得完整,这个锅差点甩给开发团队。

注意:安全日志的保留周期建议至少 180 天,合规要求严格的行业(如金融、政务)建议保留 1 年以上。日志轮转策略要提前规划好,别等到磁盘满了才想起来。

3.2 日志采集工具:Filebeat 与 Logstash

日志采集工具的选择,说白了就是「轻量 vs 重量」的权衡。我一般推荐 Filebeat + Logstash 的组合,各司其职。

3.2.1 Filebeat:轻量级采集器

Filebeat 是 Elastic 官方出品的轻量级日志采集器。它占用资源极小(内存几十 MB),适合部署在每台业务服务器上。Filebeat 负责:读取日志文件、简单过滤、发送到 Logstash 或 Elasticsearch。

它的核心优势是「保证至少一次投递」。Filebeat 内部有一个注册表文件,记录每个日志文件的读取位置。即使进程重启,它也能从断点处继续读取,不会丢日志。

# filebeat.yml 核心配置示例
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/device-auth/*.log
  fields:
    service: device-auth
    env: production

output.logstash:
  hosts: ["logstash01:5044", "logstash02:5044"]
  loadbalance: true

# 注册表文件位置(默认)
# /var/lib/filebeat/registry/filebeat.log
关键点:Filebeat 本身不做复杂的日志解析,它只负责「搬运」。复杂的解析和过滤交给 Logstash 去做,这样 Filebeat 才能保持轻量。

3.2.2 Logstash:强大的数据处理管道

Logstash 是日志处理的中枢。它接收来自 Filebeat 的日志流,然后进行解析、过滤、转换、富化,最后输出到 Elasticsearch。

Logstash 的配置分为三部分:input(输入)、filter(过滤)、output(输出)。我习惯把 filter 阶段做得重一些,因为日志质量决定了后续分析的效率。

# logstash.conf 核心配置示例
input {
  beats {
    port => 5044
    client_inactivity_timeout => 60
  }
}

filter {
  # 解析 JSON 格式日志
  if [fields][service] == "device-auth" {
    json {
      source => "message"
      target => "auth"
    }
    # 添加地理信息(如果包含 IP)
    geoip {
      source => "[auth][client_ip]"
      target => "geo"
    }
  }

  # 解析系统日志
  if [fields][service] == "system" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:hostname} %{DATA:program}: %{GREEDYDATA:log_message}" }
    }
  }
}

output {
  elasticsearch {
    hosts => ["http://es01:9200", "http://es02:9200"]
    index => "logs-%{[fields][service]}-%{+YYYY.MM.dd}"
    user => "logstash_writer"
    password => "${ES_PASSWORD}"
  }
}
避坑指南:Logstash 的 filter 阶段如果写得太复杂,会成为性能瓶颈。我曾经遇到过 filter 里嵌套了 5 层 if-else,结果 Logstash 的 CPU 直接飙到 90%。建议把复杂的解析逻辑拆成多个 pipeline,或者用 Elasticsearch 的 ingest pipeline 分担一部分。

3.3 日志聚合与存储:Elasticsearch

日志最终要存到一个能快速查询的地方。Elasticsearch 是目前最主流的日志存储和检索引擎。它基于 Lucene,支持全文检索、聚合分析、分布式扩展。

3.3.1 索引设计原则

Elasticsearch 的索引设计直接影响查询性能和存储成本。我个人的经验是:

  • 按时间分索引:每天一个索引(如 logs-device-auth-2025.03.21),方便过期删除和冷热分离。
  • 合理设置分片数:每个分片建议 20-40GB,不要超过 50GB。分片太多会导致集群管理开销大。
  • 使用别名:查询时用别名指向最近 N 天的索引,避免查询时指定一堆索引名。
# 索引模板示例(自动应用到新索引)
PUT _index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "refresh_interval": "30s"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "device_id": { "type": "keyword" },
        "service": { "type": "keyword" },
        "message": { "type": "text" },
        "geo": { "type": "geo_point" }
      }
    }
  }
}

3.3.2 生命周期管理

日志不能无限存。Elasticsearch 提供了 ILM(Index Lifecycle Management)来自动管理索引的生命周期:热阶段(Hot)→ 温阶段(Warm)→ 冷阶段(Cold)→ 删除。

阶段存储介质保留时间副本数说明
HotSSD最近 3 天1实时写入和查询
WarmHDD3-30 天1降低存储成本,仍可查询
ColdHDD/对象存储30-180 天0只读,极少查询
Delete-> 180 天-自动删除
注意:ILM 策略一定要提前配置好,不要等磁盘满了再手动删索引。我见过一个团队因为没配 ILM,导致 ES 集群磁盘使用率 98%,整个集群变成只读模式,所有日志写入全部失败。那场面,真是灾难。

3.3.3 查询与可视化

日志存进 Elasticsearch 之后,通常用 Kibana 做可视化和查询。Kibana 的 Discover 页面可以快速搜索日志,Dashboard 可以展示实时监控面板。

我个人习惯在 Kibana 里建几个固定的 Dashboard:

  • 设备认证实时看板:展示每分钟认证请求量、成功率、平均耗时。
  • 错误日志聚合看板:按错误类型和来源服务聚合,快速定位高频错误。
  • 安全事件看板:展示登录失败次数、异常 IP 分布、权限变更记录。
核心总结:日志采集与聚合的链路是「Filebeat 采集 → Logstash 解析 → Elasticsearch 存储 → Kibana 可视化」。每一层都有它的职责,不要试图让一个工具干所有事。轻量采集、集中处理、高效存储,这才是生产环境该有的样子。