ELK 日志分析平台:Filebeat、Logstash、Elasticsearch 与 Kibana 实战

本文独立分析 ELK 日志平台,覆盖日志采集、解析、字段设计、索引生命周期、查询、告警、成本控制和常见故障。

一、为什么需要集中式日志

单机部署时可以直接登录服务器查看日志,但当服务运行在多台主机、容器和多个集群中,人工登录无法快速关联请求、定位时间线和比较多个实例。

ELK 通常由 Elasticsearch、Logstash 和 Kibana 组成,实际采集侧经常使用 Filebeat 或其他 Agent。它把分散日志采集到统一平台,经过解析、脱敏和结构化后建立索引,再由 Kibana 进行查询、看板和告警。

二、日志平台的完整链路

text 复制代码
应用 / Nginx / 容器 -> Filebeat -> Logstash -> Elasticsearch -> Kibana

Filebeat 负责轻量采集和转发,Logstash 负责复杂解析、过滤、路由和脱敏,Elasticsearch 负责索引和检索,Kibana 负责查询、可视化和告警。

小规模环境可以减少中间层,但生产环境要根据吞吐、可靠性和处理复杂度决定是否引入 Logstash。

三、日志结构化设计

推荐输出 JSON 日志,而不是依赖复杂正则解析:

json 复制代码
{
  "@timestamp": "2026-10-20T10:00:00+08:00",
  "level": "ERROR",
  "service": "order-api",
  "env": "prod",
  "trace_id": "a81f2c7",
  "message": "payment timeout",
  "error_code": "PAYMENT_TIMEOUT"
}

核心字段通常包括时间、服务、环境、主机、容器、级别、Trace ID、请求路径、状态码、延迟和错误码。

不要把密码、Token、身份证号、银行卡号和完整 Cookie 写入日志。日志脱敏应尽量在应用输出或采集处理阶段完成。

四、Filebeat 采集配置示例

yaml 复制代码
filebeat.inputs:
  - type: filestream
    id: app-log
    paths:
      - /var/log/app/*.log
    parsers:
      - ndjson:
          target: ""
          overwrite_keys: true

output.logstash:
  hosts: ["logstash:5044"]

采集配置要考虑文件轮转、断点续传、权限、磁盘队列和网络中断。生产环境不应让 Agent 无限重试导致本地磁盘写满。

五、Logstash Pipeline

Logstash 可以执行解析、字段转换、过滤、脱敏和路由:

conf 复制代码
input {
  beats { port => 5044 }
}

filter {
  if [message] {
    json { source => "message" }
  }
  mutate {
    add_field => { "pipeline" => "app-log" }
  }
}

output {
  elasticsearch {
    hosts => ["https://elasticsearch:9200"]
    index => "app-%{[env]}-%{+YYYY.MM.dd}"
  }
}

解析失败时应保留原始字段并增加错误标记,不能静默丢弃日志。解析规则要有测试样例,避免日志格式变化后全量进入错误索引。

六、Elasticsearch 索引设计

索引设计影响查询性能和存储成本。需要考虑:

  • 字段类型是否正确。
  • Text 和 Keyword 是否区分。
  • 分片数量是否合理。
  • 副本数量是否匹配可用性要求。
  • 索引命名是否便于生命周期管理。
  • 时间字段是否统一为 UTC 或明确时区。

日志通常按服务、环境和日期建立索引。不要为每个用户、请求或动态值创建索引,否则会产生索引数量爆炸。

七、索引生命周期与成本控制

日志数据应有保留策略,例如热数据保留 7 天,温数据保留 30 天,超过期限自动删除或转存对象存储。高价值审计日志和普通调试日志不应采用同样的保留时间。

成本控制方向:

  • 降低无价值日志级别。
  • 过滤重复健康检查日志。
  • 统一字段并减少冗余内容。
  • 使用生命周期策略自动迁移和删除。
  • 限制查询时间范围。
  • 监控磁盘水位、分片和查询耗时。

八、Kibana 查询与看板

看板建议按服务、环境和时间过滤,至少包含错误趋势、慢请求、状态码、主机、实例和 Trace ID。查询应优先使用结构化字段和精确过滤,避免长期执行全量通配查询。

典型排障流程:先按时间和服务定位错误,再按 Trace ID 关联入口日志、应用日志和依赖调用,最后查看发布记录和资源指标。

九、常见故障排查

1. 日志没有进入 Elasticsearch

逐层检查文件权限、Filebeat 状态、网络、Logstash 端口、解析错误、Elasticsearch 认证和索引写入权限。

2. 日志字段无法搜索

检查字段是否被解析为 Text、是否需要 Keyword、索引模板是否生效,以及 Kibana 数据视图是否刷新。

3. 日志时间不正确

统一应用、Agent、Logstash 和 Elasticsearch 的时间处理。不要只修改 Kibana 展示时区来掩盖源数据错误。

4. Elasticsearch 磁盘爆满

立即检查索引大小、分片、保留周期和异常日志量;必要时临时降低采集或删除可丢弃数据,但删除前要确认审计和合规要求。

5. 查询越来越慢

检查时间范围、字段类型、分片数量、节点资源、查询语句和高基数字段。避免在生产高峰执行大范围聚合。

6. 解析规则变更后日志丢失

查看 Logstash 错误标签和原始字段,先在测试数据上验证新规则,再灰度发布。解析失败不能直接丢弃原始日志。

十、日志安全与权限

日志平台拥有大量业务信息,应配置用户、角色、索引访问范围和审计。开发人员可以查询测试日志,不应默认读取全部生产日志和安全审计日志。

敏感字段应在应用、采集或处理层脱敏。已经写入 Elasticsearch 的敏感数据不能简单依靠 Kibana 隐藏,必要时要删除、重建索引并轮换相关凭据。

十一、与指标和链路追踪联动

日志本身适合记录具体事件,指标适合观察趋势,链路追踪适合跨服务关联。三者应共享服务名、环境、实例和 Trace ID,才能在看板上从错误率跳到日志,再从日志跳到具体请求链路。

十二、总结

ELK 的核心不是把所有文本集中起来,而是建立一套可检索、可关联、可保留、可删除、可审计的日志工程。采集要可靠,字段要结构化,敏感信息要脱敏,索引要有生命周期,查询要有边界,故障时还要能通过 Trace ID 还原请求链路。

CSDN 发布时先上传 elk-log-architecture.png,再替换图片路径。

相关推荐
freejackman3 小时前
【工程化】从“单兵作战”到“多引擎架构”:基于门面模式的重构实战
大数据·数据库·hive·sql·测试工具·设计模式·架构
字节跳动数据平台5 小时前
火山引擎知识引擎VeKnow进化之路(上):从“人有数可用”到“AI有智可循”
大数据
Elasticsearch6 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
elasticsearch
Flynn Liang7 小时前
Apache Superset 重要特性详解(三):语义层 / 权限 / 缓存 / 嵌入的实战最佳实践(2026 版)
大数据·clickhouse·数据可视化·架构设计·superset·数据分析平台
小田学Python19 小时前
工具调用:让 Agent 从“说”到“做”
大数据·大模型·agent·ai工具·deepseek
GrowingIO技术社区1 天前
用户行为分析怎么做?从业务目标到改进验证的完整流程
大数据·数据挖掘·数据分析
瑞克-桑切斯1 天前
docker Harbor 单机部署手册
大数据·运维·elasticsearch·docker·容器
演艺大赏1 天前
NiFi 起不来、登不上、节点被挤掉:一份按日志定位的排错清单
大数据
freejackman1 天前
【实战三】撕开脱敏盲区:深度解析 CASE WHEN 与窗口函数血缘
大数据·数据库·sql
wafrdggh2 天前
2026电商快递批量查询怎么用?固乔助手模板设置评测
大数据·数据库·小程序