本文基于 Docker 环境,详细讲解 ELK Stack(Elasticsearch 8.6.2 + Kibana 8.6.2 + Logstash 8.6.2)的部署流程,同时提供轻量级日志采集工具 Filebeat 的可选集成方案,帮助开发者快速搭建企业级日志管理平台。

一、ELK 核心组件与工作流解析

1.1 组件功能拆解

组件 核心角色 可选性
Elasticsearch 分布式搜索与存储引擎,负责日志的持久化、检索与聚合分析 必选
Kibana 可视化前端,提供日志查询、仪表盘、告警等交互能力 必选
Logstash 数据处理管道,支持日志的解析、过滤、 enrichment(如字段提取、数据清洗) 可选
Filebeat 轻量级日志采集器,部署在日志源服务器,低消耗采集日志并推送至 Logstash/ES 可选

1.2 日志流全链路

  • 完整链路(含 Logstash+Filebeat)业务服务器日志 → Filebeat 采集 → Logstash 处理 → Elasticsearch 存储 → Kibana 可视化
  • 简化链路(无 Logstash)业务服务器日志 → Filebeat 直连 ES → Kibana 可视化

二、环境准备:Docker 与网络初始化

2.1 安装 Docker(CentOS 示例)

# 下载阿里云 Docker CE 仓库配置文件
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

# 3. 安装 Docker CE
yum install docker-ce -y

# 4. 启动并设置开机自启
systemctl start docker
systemctl enable docker

2.2 验证 Docker 环境

# 查看 Docker 系统信息(版本、存储驱动等),确认启动正常
docker info

2.3 创建 ELK 专用 Docker 网络

docker network create elk

三、核心组件部署:Elasticsearch

3.1 拉取 ES 镜像并启动容

docker run -d \
--name=elasticsearch \
-v es-data:/usr/share/elasticsearch/data \
-e ES_JAVA_OPTS="-Xms256m -Xmx512m" \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
--net elk \
-p 9200:9200 -p 9300:9300 \
docker.elastic.co/elasticsearch/elasticsearch:8.6.2
  • 参数说明
    • es-data 数据卷:持久化 ES 数据,删除容器不丢失日志;
    • ES_JAVA_OPTS:JVM 内存配置,根据服务器内存调整(建议至少 2GB 内存服务器设置 -Xms1g -Xmx2g);
    • xpack.security.enabled=false:关闭安全认证(生产环境需开启并配置密码)。

3.2 验证 ES 服务

重启 Elasticsearch 容器使配置生效
docker restart elasticsearch

# 访问 ES 接口,返回 JSON 即正常(替换“宿主机IP”为实际地址)
curl http://宿主机ip:9200

四、核心组件部署:Kibana(ES 可视化界面)

4.1拉取 Kibana 镜像并启动容器

docker run -d \
--name=kibana \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
-e I18N_LOCALE=zh-CN \
--net elk \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:8.6.2
  • 访问验证:浏览器打开 http://宿主机ip:5601,首次加载需等待 1-2 分钟初始化完成后,即可看到中文界面(因 ES 关闭认证,无需登录)。

五、可选组件:Logstash 部署与配置

5.1 编写 Logstash 管道配置

# 创建 Logstash 配置目录
sudo mkdir -p /etc/logstash/conf.d

# 编辑 Logstash 管道配置
sudo vi /etc/logstash/conf.d/my-pipeline.conf

输入以下内容(定义日志的输入、过滤、输出规则):

# 1. 输入:监听 TCP 5044 端口,接收 JSON 格式日志
input {
  tcp {
    port => 5044
    # 输入为json线数据
    codec => json_lines
  }
}

# 2. 过滤:调整时间戳为北京时间(UTC+8)
filter {
  ruby {
    code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
  }
  ruby {
    code => "event.set('@timestamp',event.get('timestamp'))"
  }
  mutate {
    remove_field => ["timestamp"]
  }
}

# 3. 输出:1. 控制台打印(调试用);2. 发送至 ES
output {
  stdout { codec => rubydebug } # 调试用,生产可注释
  elasticsearch {
    hosts => ["http://宿主机IP:9200"]
    index => "logstash-%{[server_name]}-%{+yyyy.MM.dd}"
  }
}

5.2 启动 Logstash 容器

docker run -d --name logstash --restart=always \
-p 5044:5044 \
-v /etc/logstash/conf.d/my-pipeline.conf:/usr/share/logstash/pipeline/logstash.conf \
--net elk \
docker.elastic.co/logstash/logstash:8.6.2
  • 验证:执行 docker logs -f logstash,看到 Pipeline main started 即表示启动成功。

六、可选组件:Filebeat 部署与配置(轻量级日志采集)

6.1 编写 Filebeat 配置文件

# 修正原命令“mkdir”路径错误(原“filebeat.yml”是文件,需先建目录)
sudo mkdir -p /usr/local/filebeat

# 编辑 Filebeat 配置文件
sudo vi /usr/local/filebeat/filebeat.yml

输入以下内容(采集系统日志并推送至 Logstash):

# 日志输入源配置
filebeat.inputs:
  - type: log                # 输入类型:日志文件
    enabled: true            # 启用该输入配置
    paths:                   # 待采集的日志路径(系统日志)
      - /var/log/*.log       # 采集 /var/log 下所有 .log 结尾的文件
      - /var/log/messages    # 采集系统核心日志

# 禁用索引生命周期管理(ILM),使用自定义索引
# setup.ilm.enabled: false

# 新增 processors 配置,添加 server_name 字段
processors:
  - add_fields:
      fields:
        server_name: "filebeat"  # 替换为实际服务器标识,如web-server-01
      target: ""  # 直接添加到顶层字段

# 输出配置发送到 Logstash
output.logstash:
  hosts: ["logstash-host:5044"]  # Logstash 的地址和端口
  codec: json_lines

# ========== 可选:索引模板(若直接输出到 Elasticsearch) ==========
# setup.template.name: "java-app"
# setup.template.pattern: "java-app-*"
# output.elasticsearch:
#   hosts: ["http://es-host:9200"]
#   index: "java-app-%{+yyyy.MM.dd}"

6.2 启动 Filebeat 容器

docker run -d --name filebeat --restart=always \
-v /usr/local/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \  # 挂载配置文件
-v /var/log:/var/log \                                                # 挂载宿主机日志目录(只读)
--user root \                                          # 以 root 权限运行(确保日志读取权限)
-p 5045:5044 \  # 宿主机端口改为5045,容器内仍为5044    
--net elk \                                                           # 加入 ELK 专用网络
docker.elastic.co/beats/filebeat:8.6.2
  • 验证:执行 docker logs -f filebeat,无 ERROR 日志即表示采集正常。

七、全链路测试:从日志采集到可视化

7.1 生成测试日志

在宿主机执行命令,触发 Filebeat 采集:

echo "ELK 测试日志:$(date +'%Y-%m-%d %H:%M:%S')" >> /var/log/test.log

7.2 在 Kibana 查看日志

  1. 创建数据视图

    • 进入 Kibana → 「管理」→「数据视图」→「创建数据视图」;
    • 索引模式输入 logstash-*,时间字段选择 @timestamp,点击「创建」。
  2. 查询日志

    • 进入「Discover」,时间范围选择「今天」,即可看到测试日志及系统日志。

八、Java 应用日志采集扩展(可选)

若需采集 Java 应用日志(如 Spring Boot),可通过以下步骤配置:

8.1 配置 Logback 输出 JSON 日志

在 Java 项目的 pom.xml 中引入依赖:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.3</version>
</dependency>

(因为我在logstash配置中使用到的功能需要老版本的依赖支持,所以是6.3)

在项目的resources下添加logstash配置logback-spring.xml文件(可以自己定义):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level)] %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n
            </Pattern>
        </layout>
    </appender>
    <!--logback输出 -->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>101.126.94.192:5044</destination>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <!-- 打印行号、方法名,默认为false -->
            <includeCallerData>true</includeCallerData>
            <!-- 设置时区-->
            <timeZone>UTC</timeZone>
            <!--日期格式化-->
<!--            <timestampPattern>yyyy-MM-dd HH:mm:ss.SSS</timestampPattern>-->
            <!--添加自定义属性,server_name是服务器的名称-->
            <customFields>{"server_name":"user-server"}</customFields>
        </encoder>
        <!-- 设置超时时间,默认没有,使用集群的时候可以加上-->
<!--        <writeTimeout>30 seconds</writeTimeout>-->
    </appender>

    <root level="info">
        <!--本地开发调试将控制台输出打开,同时日志文件输出挂壁,提高日志性能:线上部署请务必将控制台输出关闭 -->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

8.2 验证 Java 日志

启动 Java 应用后,在 Kibana 中可看到索引 logstash-user-server-yyyy.MM.dd 的应用日志。

九、生产环境优化建议

  1. ES 高可用:生产环境需部署 ES 集群(至少 3 节点),通过 discovery.seed_hosts 配置节点发现;
  2. 安全加固:开启 ES 安全认证(xpack.security.enabled=true),配置复杂密码并定期轮换;
  3. 资源隔离:为每个 ELK 组件分配独立的 Docker 资源限制(如 --memory 4g);
  4. 日志清理:配置 ES 索引生命周期策略(ILM),自动清理过期日志,避免磁盘占满。

本文详细覆盖了 ELK Stack 的 Docker 部署全流程,从核心组件到可选工具 Filebeat 的集成,帮助开发者快速落地日志管理方案。若有疑问,欢迎在评论区交流~

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐