You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Docker容器中Java服务的日志发送至ELK集群

实现Spring Boot服务通过HTTP直接发送日志到ELK栈(Docker环境)

1. 配置Spring Boot日志输出(Logback + HTTP Appender)

你的服务基于SLF4J + Spring Boot,默认日志实现为Logback。我们可以借助logstash-logback-encoder依赖,直接将日志以HTTP POST方式发送到Logstash(ELK栈的日志接收组件),完全无需本地存储日志文件。

1.1 添加项目依赖

加入兼容Java 8的logstash-logback-encoder版本:

Maven:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>6.6</version> <!-- 适配Java 8与Spring Boot 2.x -->
</dependency>

Gradle:

implementation 'net.logstash.logback:logstash-logback-encoder:6.6'

1.2 编写Logback配置文件

在src/main/resources下创建logback-spring.xml,配置HTTP Appender并移除本地文件输出逻辑:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 控制台输出(可选,用于本地调试) -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- HTTP发送日志到Logstash的Appender -->
    <appender name="LOGSTASH_HTTP" class="net.logstash.logback.appender.LogstashHttpAppender">
        <!-- Logstash容器的HTTP接收地址,替换为你的容器hostname/IP和端口 -->
        <url>http://elk-logstash:5000/logs</url>
        <!-- 以JSON格式输出日志,添加自定义字段区分服务 -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"service_name":"your-service-name","environment":"prod"}</customFields>
        </encoder>
        <!-- 网络波动时的重试策略 -->
        <retryPolicy class="ch.qos.logback.core.retry.RetryOnErrorPolicy"/>
        <maxRetries>3</maxRetries>
    </appender>

    <!-- 根日志级别配置,同时输出到控制台与Logstash -->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="LOGSTASH_HTTP"/>
    </root>
</configuration>

注意:url中的elk-logstash是Logstash容器的hostname,需确保Docker网络连通;5000为后续Logstash配置的HTTP输入端口,可自行调整。

2. 配置Logstash的HTTP输入

在ELK栈的Logstash容器中,修改logstash.conf配置文件,添加HTTP输入并配置Elasticsearch输出:

# 输入:监听HTTP请求
input {
  http {
    port => 5000
    codec => json
  }
}

# 过滤(可选,按需处理日志字段)
filter {
  if [service_name] {
    mutate {
      add_tag => ["%{service_name}"]
    }
  }
}

# 输出:发送到Elasticsearch
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"] # Elasticsearch容器的hostname与端口
    index => "spring-boot-logs-%{+YYYY.MM.dd}" # 按日期生成索引
  }
}

启动Logstash容器时挂载配置目录(确保加载上述配置):

docker run -d --name elk-logstash --network elk-network \
  -v $(pwd)/logstash/config:/usr/share/logstash/config \
  -v $(pwd)/logstash/pipeline:/usr/share/logstash/pipeline \
  -p 5000:5000 \
  docker.elastic.co/logstash/logstash:7.17.0 # 7.x系列兼容Java 8

3. Docker网络连通配置

将Spring Boot容器与ELK组件加入同一自定义Docker网络,确保互相通信:

  1. 创建自定义网络:
docker network create elk-network
  1. 启动Elasticsearch时加入该网络:
docker run -d --name elasticsearch --network elk-network \
  -e "discovery.type=single-node" \
  -p 9200:9200 \
  docker.elastic.co/elasticsearch/elasticsearch:7.17.0
  1. 启动Spring Boot容器时加入同一网络:
docker run -d --name your-spring-boot-service --network elk-network \
  -p 8080:8080 \
  your-service-image:latest

4. 验证配置

  1. 启动所有容器后,访问Kibana(默认端口5601),创建索引模式spring-boot-logs-*。
  2. 触发Spring Boot服务生成日志(如调用接口),在Kibana的Discover页面即可查看日志数据。

内容的提问来源于stack exchange,提问作者Radu Aramă

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:45:49