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

Docker化Java应用连接Elasticsearch被拒绝请求助

问题描述

我有一个向Elasticsearch发送日志的Java应用,部署时遇到如下错误:

08:20:39.498 [main] INFO  c.e.E.ElasticsearchExampleApplication - Starting ElasticsearchExampleApplication v0.0.1-SNAPSHOT using Java 1.8.0_362 on 1291d5986694 with PID 8 (/app/ElasticsearchExample-0.0.1-SNAPSHOT.jar started by root in /app)  08:20:39.501 [main] INFO  c.e.E.ElasticsearchExampleApplication - No active profile set, falling back to 1 default profile: "default"  08:20:39,751 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - Attempted to append to non started appender [null]. 08:20:39,751 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - Attempted to append to non started appender [null]. 08:20:39,751 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - Attempted to append to non started appender [null]. 08:20:39.762 [es-writer-1] WARN  es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused)  08:20:39,762 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.013 [es-writer-1] WARN  es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused)  08:20:40,013 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.013 [main] INFO  c.e.E.ElasticsearchExampleApplication - Started ElasticsearchExampleApplication in 0.899 seconds (JVM running for 1.393)  Strating 08:20:40.016 [main] INFO  c.e.E.ElasticsearchExampleApplication - exiting the application  08:20:40.264 [es-writer-1] WARN  es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused)  08:20:40,264 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.515 [es-writer-1] WARN  es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused)  08:20:40,516 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused) 08:20:40.767 [es-writer-1] WARN  es-error-logger - Failed to send events to Elasticsearch: Connection refused (Connection refused)  08:20:40,767 |-WARN in com.internetitem.logback.elasticsearch.util.ErrorReporter@37e20cce - Failed to send events to Elasticsearch: Connection refused (Connection refused)

Elasticsearch、Kibana和Java应用均以Docker容器化方式运行,相关配置文件如下:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.11</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>ElasticsearchExample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>ElasticsearchExample</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
            <dependency>
      <groupId>com.internetitem</groupId>
      <artifactId>logback-elasticsearch-appender</artifactId>
       <version>1.6</version>
    </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

logback.xml

<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="true" scan="true">

  <!-- when the profile is not local, below appender will be applied -->
   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg %n</pattern>
    </encoder>
  </appender>
    <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender">
        <url>localhost:9200/_bulk</url>
        <index>demo-%date{yyyy-MM-dd}</index>
        <type>tester</type>
        <loggerName>es-logger</loggerName> <!-- optional -->
        <errorLoggerName>es-error-logger</errorLoggerName> <!-- optional -->
        <connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) -->
        <errorsToStderr>false</errorsToStderr> <!-- optional (default false) -->
        <includeCallerData>false</includeCallerData> <!-- optional (default false) -->
        <logsToStderr>false</logsToStderr> <!-- optional (default false) -->
        <maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) -->
        <maxRetries>3</maxRetries> <!-- optional (default 3) -->
        <readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) -->
        <sleepTime>250</sleepTime> <!-- optional (in ms, default 250) -->
        <rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) -->
        <includeMdc>false</includeMdc> <!-- optional (default false) -->
        <maxMessageSize>100</maxMessageSize> <!-- optional (default -1 -->
        <authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication" /> <!-- optional -->
        <properties>
            <property>
                <name>host</name>
                <value>${HOSTNAME}</value>
                <allowEmpty>false</allowEmpty>
            </property>
            <property>
                <name>severity</name>
                <value>%level</value>
            </property>
            <property>
                <name>thread</name>
                <value>%thread</value>
            </property>
            <property>
                <name>stacktrace</name>
                <value>%ex</value>
            </property>
            <property>
                <name>logger</name>
                <value>%logger</value>
            </property>
        </properties>
        <headers>
            <header>
                <name>Content-Type</name>
                <value>application/json</value>
            </header>
        </headers>
    </appender>
    <!-- We don't want to see a never ending cascade of connection failed ERRORS -->
    <!-- <logger name="my-error-logger" level="OFF" /> -->
    <logger name="es-logger" level="INFO" additivity="false">
        <appender name="ES_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <encoder>
                <pattern>%msg</pattern> <!-- This pattern is important, otherwise it won't be the raw Elasticsearch format anymore -->
            </encoder>
        </appender>
    </logger>
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="ELASTIC" />
    </root>

</configuration>

docker-compose.yaml

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
    #image: docker.elastic.co/elasticsearch/elasticsearch:5.6.16
    #image: docker.elastic.co/elasticsearch/elasticsearch:5.6.0
    container_name: my-elasticsearch
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      core:

  kibana:
    image: docker.elastic.co/kibana/kibana:7.12.1
    #image: docker.elastic.co/kibana/kibana:5.6.16
    #image: yuzu/docker-kibana:v5.0
    container_name: my-kibana
    depends_on:
      - elasticsearch
    ports:
      - "5601:5601"
    networks:
      core:

  my-java-app:
    image: my-java-app:latest
    container_name: my-java-app
    ports:
      - "8080:8080"
    volumes:
      - ./logs:/app/logs
    environment:
      - JAVA_OPTS=-Xmx512m -Dspring.profiles.active=prod
    networks:
      core:

networks:
  core:
解决方案

针对你遇到的两个核心问题,分别给出修复步骤:

1. 解决Elasticsearch连接拒绝问题

在Docker Compose的同一网络中,容器的localhost指向自身,无法通过它访问其他服务。需要修改logback.xml中的Elasticsearch地址:

  • 将 <url>localhost:9200/_bulk</url> 改为 <url>http://elasticsearch:9200/_bulk</url>
    这里的elasticsearch是docker-compose.yaml中Elasticsearch服务的名称,Docker会自动解析这个名称到对应容器的IP。

2. 解决RollingFileAppender未启动警告

logback.xml中定义的ES_FILE appender缺少文件路径和滚动策略配置,导致无法初始化。修改如下:

<logger name="es-logger" level="INFO" additivity="false">
    <appender name="ES_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/app/logs/es-logs.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>/app/logs/es-logs.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>%msg</pattern>
        </encoder>
    </appender>
</logger>

配置的文件路径和docker-compose中挂载的日志目录对应,同时添加了基于大小和时间的滚动策略,确保appender能正常启动。

额外优化建议

  • 确保Elasticsearch服务就绪后再启动Java应用:给docker-compose.yaml的Elasticsearch服务添加健康检查
elasticsearch:
  # ... 原有配置
  healthcheck:
    test: ["CMD-SHELL", "curl -f http://localhost:9200/_cluster/health || exit 1"]
    interval: 10s
    timeout: 10s
    retries: 5
  • 修改Java应用的启动依赖,等待Elasticsearch健康检查通过
my-java-app:
  # ... 原有配置
  depends_on:
    elasticsearch:
      condition: service_healthy

内容的提问来源于stack exchange,提问作者cokachi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:12:04