当前位置: 首页 > ai >正文

Docker环境下的EFK日志分析实践:从Filebeat采集到Kibana可视化的完整部署指南

言简意赅的讲解Elasticsearch、Logstash、Kibana解决的痛点

一、什么是 EFK

在传统的 ELK(Elasticsearch、Logstash、Kibana)日志分析堆栈中,人们往往会觉得 Logstash 过于臃肿,或者想在容器环境下使用更轻量的日志收集解决方案,这时候就衍生出了 EFK

  • Elasticsearch:负责存储和检索日志信息的搜索引擎
  • Filebeat:轻量级日志收集器,负责从容器或主机上采集日志并发送到 Elasticsearch
  • Kibana:与 Elasticsearch 配合使用的可视化和管理工具

相比 Logstash,Filebeat 占用更少的资源,在 Docker / 容器场景下也更易配置和维护。由于目前很多人都已经将微服务或业务应用容器化,因此 EFK 组合在容器日志采集领域非常常见。

Elasticsearch、Logstash、Kibana 部署成功


二、为什么选择 OSS 版本(社区版)

Elasticsearch 与 Kibana 有社区版(Open Source Software,OSS)商业版(Basic/Enterprise/Platinum 等)之分。

  • 社区版(OSS 版):不包含 X-Pack 的商业特性,如高级安全、图表分析、机器学习等。但是对于普通的日志检索和可视化等基础场景,OSS 版已经足够使用。
  • 商业版:提供更丰富的特性,比如内置认证、集群监控、报警机制、机器学习分析日志趋势等等。

本篇示例所使用的是官方提供的 *-oss:7.10.2 镜像(Elasticsearch OSS 版、Kibana OSS 版、Filebeat OSS 版),如果你需要更高级的功能,可考虑商业版


三、Docker Compose 配置详解

以下是一个修正后的 Docker Compose 示例文件,它包含了 Elasticsearch、Kibana、Filebeat 三个服务的配置。

  1. 修复了原有的缩进问题,使之符合 Docker Compose 的标准结构;
  2. 指明了必要的环境变量;
  3. 备注了可选的 volumes 设置,以便数据持久化;
  4. 提供了健康检查(healthcheck)示例。

提示:如果你要在生产环境使用,记得修改默认账号密码(商业版或者自行启用安全插件),以及持久化 Elasticsearch 的数据。

请将以下内容保存为 docker-compose.yml(或你自己喜欢的文件名):

version: '3.8'
services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2container_name: elasticsearchenvironment:- discovery.type=single-node- ES_JAVA_OPTS=-Xms512m -Xmx1g  # 最小 512MB,最大 1GB# 如果需要数据持久化,请取消以下注释,并在同级定义一个 volume:# volumes:#   - es_data:/usr/share/elasticsearch/dataports:- "9200:9200"healthcheck:# 检查 Elasticsearch 状态是否到达 yellow 状态(单节点集群很难达到 green)test: ["CMD", "curl", "-f", "http://elasticsearch:9200/_cluster/health?wait_for_status=yellow&timeout=1s"]interval: 30stimeout: 10sretries: 10start_period: 30skibana:image: docker.elastic.co/kibana/kibana-oss:7.10.2container_name: kibanaenvironment:- csp.enabled=false  # 禁用 CSP 插件- ELASTICSEARCH_HOSTS=http://elasticsearch:9200- csp.strict=false  # 禁用 Content Security Policy (CSP)- ELASTICSEARCH_REQUESTTIMEOUT=120000  # 将请求超时设置为120秒- server.basePath=/elastic/home  # 设置 basePath 为 /elastic/home- server.rewriteBasePath=true  # 启用 basePath 重写- server.host=0.0.0.0- csp.warnLegacyBrowsers=false  # 禁用对旧版浏览器的 CSP 警告volumes:- ./kibana.yml:/usr/share/kibana/config/kibana.yml:ro  # 挂载本地 kibana.yml 文件ports:- "5601:5601"depends_on:elasticsearch:condition: service_healthyfilebeat:image: docker.elastic.co/beats/filebeat-oss:7.10.2container_name: filebeatuser: rootenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200volumes:# 挂载 Docker 日志文件目录- /var/lib/docker/containers:/var/lib/docker/containers:ro# 挂载 业务 日志文件目录- ./log:/log:ro# 挂载 filebeat 自身日志目录- ./log/filebeat:/var/log/filebeat# 挂载 Filebeat 配置文件- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro# Docker 容器信息元数据所需- /var/run/docker.sock:/var/run/docker.sockentrypoint: ["/bin/sh", "-c", "chmod 0666 /var/run/docker.sock && filebeat"]  # 修改 socket 权限并运行 filebeatdepends_on:elasticsearch:condition: service_healthy# 如果需要持久化数据,需要在同级添加 volumes 节点,比如:
# volumes:
#   es_data:
#     driver: local

注意:以上示例使用了 :ro(只读)方式挂载部分文件或目录,以确保 Filebeat 对日志文件只读;并在 entrypoint 里修改了 Docker socket 的权限,这在有些场景下是必须的(否则有权限问题)。


四、Filebeat 配置文件解析与修正

接下来是你提供的 filebeat.yml 文件,已经合并并修复了部分错误。主要注意到你原本的配置里有两处 processors,这可能会导致解析冲突或覆盖。通常我们将所需的 processors 写在同一个 processors 列表中即可,如下所示:

# Filebeat Input Configuration
filebeat.inputs:- type: containerpaths:- /var/lib/docker/containers/*/*.log  # 确保这里的路径包含 .log 文件json:keys_under_root: true   # 将 JSON 字段直接放置在根字段下overwrite_keys: true    # 如果字段已存在,允许覆盖add_error_key: true     # 如果解析失败,添加 error 字段- type: logpaths:- /log/kong/*.log  # All kong logsfields:container.name: kong  # 添加 container.name 字段fields_under_root: true # 将自定义字段放置在根字段# Optional: Processors to enhance logs
processors:- add_docker_metadata:host: "unix:///var/run/docker.sock"  # 添加 Docker 容器的元数据信息- add_fields:target: "docker_info"fields:container_name: "${docker.container.name}"container_id: "${docker.container.id}"# Output Configuration
output.elasticsearch:hosts: ["http://elasticsearch:9200"]  # 指向 Elasticsearch OSS 实例# Optional: Enable logging for Filebeat
logging:level: info  # 日志级别,可以是 debug、info、warn、errorto_files: true  # 日志输出到文件files:path: /var/log/filebeat  # 日志文件目录name: filebeat           # 日志文件名前缀keepfiles: 7            # 保留的日志文件数量permissions: 0644       # 日志文件权限# Optional: Setup template
setup.template:name: "filebeat"        # 索引模板名称pattern: "filebeat-*"   # 模板匹配的索引模式# Optional: Disable ILM (Index Lifecycle Management) since OSS version doesn't have it
setup.ilm.enabled: false  # 社区版没有 ILM 功能,确保设置为 false

1. input 配置说明

  • type: container:专门用来采集 Docker 容器输出的日志。注意 paths 指向 /var/lib/docker/containers 下所有容器的 .log 文件。
  • type: log:直接读取 /log/kong/*.log 文件,可用于采集你自定义的业务日志、Kong 网关日志等。

2. processors 配置说明

  • add_docker_metadata:让日志中自动带上容器的 metadata(容器名、镜像名等)。
  • add_fields:自定义添加一些字段,比如这里将容器的 name、id 放到 docker_info 字段下,便于后续检索、可视化。

3. 输出与日志

  • 输出到 Elasticsearch,通过 output.elasticsearch 指定地址。
  • 自身日志输出到 /var/log/filebeat,便于排查 Filebeat 的问题。

五、启动与访问

  1. 启动容器
    在含有 docker-compose.yml 文件的目录下,执行:

    docker-compose up -d
    

    Docker 会自动拉取(或使用已有的)Elasticsearch、Kibana、Filebeat 三个镜像并启动容器。

  2. 查看容器状态

    docker ps
    

    确保 elasticsearch, kibana, filebeat 均处于 Up 状态。

  3. 访问 Kibana
    在浏览器中打开 http://<宿主机IP>:5601/elastic/home(因为我们将 server.basePath 设置为了 /elastic/home),即可进入 Kibana 页面。

  4. 验证日志采集

    • 在 Kibana 界面里,进入“Discover”页面,选择 filebeat-* 索引(若没出现,需手动创建 Index Pattern)。
    • 查看是否已经能搜到来自容器或自定义日志文件的日志。

六、更多优化与注意事项

  1. 持久化数据

    • 如果仅是做测试,可以不持久化数据;
    • 在生产环境中,请务必给 Elasticsearch 配置 volumes定期备份,避免数据意外丢失。
  2. 内存限制

    • ES_JAVA_OPTS=-Xms512m -Xmx1g 是个相对保守的设置;如果机器内存足够,最好将 Elasticsearch 的内存分配为总内存的 50% 左右,但是上限不要超过 32GB(超过会导致 JVM 关闭指针压缩,降低效率)。
  3. 安全认证

    • OSS 版本默认不带高级安全插件,如需密码保护、用户管理,需要自行安装安全插件或切换到商业版;
    • 如果需要对外网暴露接口,务必添加安全措施(如 Nginx Proxy + HTTP Basic Auth 或使用反向代理做认证)。
  4. 多节点集群

    • 当前示例使用 discovery.type=single-node,适合开发和测试;
    • 生产环境往往需要多节点 Elasticsearch 集群,以保证高可用和横向扩展。
  5. Kibana basePath

    • 本示例启用了 server.basePath=/elastic/home 并重写,如果你不喜欢 /elastic/home,可以自行修改成别的路径或干脆不设置。
  6. Filebeat 的高级配置

    • 还可以增加更多 processors,如 drop_fieldsgeoip 等;
    • 如果你的日志格式较为复杂,可使用 ingest pipelines(需要在 Elasticsearch 中配置)来做高级的日志解析。

七、总结

通过上文的介绍与配置示例,你可以快速搭建一套 EFK (Elasticsearch + Filebeat + Kibana) 日志采集与可视化系统。

  • Docker Compose 让部署更简单;
  • Elasticsearch 负责日志检索与存储;
  • Kibana 提供可视化与简单运维功能;
  • Filebeat 以更轻量的方式采集容器或主机日志。

由于本文使用的是 OSS 版本镜像,如果你需要企业级功能,如内置安全、监控、报警、机器学习等高级特性,可以考虑商业版或自行研究如何给 OSS 版本添加插件。但对于大多数日常使用场景来说,OSS 版足以支撑常规的日志检索与展示需求。


通过上述内容,你就已经基本理解了这个方法,基础用法我也都有展示。如果你能融会贯通,我相信你会很强

Best
Wenhao (楠博万)

http://www.xdnf.cn/news/14413.html

相关文章:

  • 【LeetCode 207】课程表(有向无环图 DAG、拓扑排序)
  • 在C++中进程间通信(IPC)
  • 数据库学习(七)——MySQL执行引擎
  • Google机器学习实践指南(非线性特征工程解析)
  • 人工智能学习37-Keras手写识别预测
  • 对于数据库触发器自动执行的理解
  • Java类的继承
  • Luckfox Pico Pi RV1106学习<3>:支持IMX415摄像头
  • BeckHoff <---> Keyence (MD-X)激光 刻印机 Profient 通讯
  • Elasticsearch:什么是混合搜索?
  • AIGC 基础篇 高等数学篇 06 向量代数与空间解析几何
  • 人月神话-学习记录
  • SQL Developer 表复制
  • Python安装与使用教程
  • Maven在依赖管理工具方面的内容
  • Java多线程通信:wait/notify与sleep的深度剖析(时序图详解)
  • Spring是如何实现有代理对象的循环依赖
  • 【SQLAlchemy系列】 SQLAlchemy 中的多条件查询:or*与 in*操作符
  • 智能土木通 - 土木工程专业知识问答系统02-RAG检索模块搭建
  • AC耦合与DC耦合
  • 体验AI智能投资!AI Hedge Fund了解一下
  • Java可变参数方法的常见错误与最佳实践
  • hyper-v虚拟机使用双屏
  • iOS —— UI(2)
  • Spring Cloud 所有组件全面总结
  • 「AI大数据」| 智慧公路大数据运营中心解决方案
  • Java类加载器与双亲委派模型深度解析
  • DNS递归查询
  • BOLL指标
  • Oracle21cR3之客户端安装错误及处理方法