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

如何在Logstash主机离线时禁用Logback的Logstash Appender?

问题

我在Spring Boot应用中集成了logback-logstash,搭配ELK Stack使用。在logback-spring.xml中配置了如下LogstashTcpSocketAppender:

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>https://mykibana.url</destination>
    <!-- 其他配置项 -->
</appender>

正常网络环境下连接Logstash一切正常,但处于离线环境(比如在火车上工作)且不想本地启动完整ELK Stack时,控制台会被大量连接拒绝的警告日志刷屏:

00:37:15,429 |-WARN in net.logstash.logback.appender.LogstashTcpSocketAppender[logstash] - 
    at java.net.ConnectException: Connection refused: no further information

需要通过Logback配置实现以下两种效果之一:

  1. 能连接Logstash就使用该Appender,无法连接则自动禁用
  2. 重试3次连接失败后就放弃重试
解决方案

方案一:连接失败后自动禁用Logstash Appender

可以通过配置连接策略+关闭状态警告的方式实现,让Appender在连接失败后停止尝试并避免日志刷屏:

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>https://mykibana.url</destination>
    <!-- 设置快速失败策略,连接失败后不再重试 -->
    <connectionStrategy class="net.logstash.logback.appender.connect.FailFastConnectionStrategy" />
    <!-- 关闭Appender自身的状态警告输出,避免刷屏 -->
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
    <!-- 添加过滤器,当连接失败时拒绝向该Appender输出日志 -->
    <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
        <evaluator class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
            <expression>
                // 判断Appender是否处于连接失败状态
                logger.getContext().getStatusManager().getCopyOfStatusList().stream()
                    .anyMatch(s -> s.getMessage().contains("Connection refused"))
            </expression>
        </evaluator>
        <onMismatch>NEUTRAL</onMismatch>
        <onMatch>DENY</onMatch>
    </filter>
    <!-- 原有其他配置 -->
</appender>

方案二:限制重试次数后放弃

使用ExponentialBackoffConnectionStrategy配置最大重试次数,达到次数后停止重试:

<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>https://mykibana.url</destination>
    <!-- 配置指数退避连接策略,设置最大重试次数为3次 -->
    <connectionStrategy class="net.logstash.logback.appender.connect.ExponentialBackoffConnectionStrategy">
        <initialDelay>1000</initialDelay> <!-- 初始重试延迟1秒 -->
        <maxDelay>5000</maxDelay> <!-- 最大重试延迟5秒 -->
        <maxRetries>3</maxRetries> <!-- 最多重试3次 -->
    </connectionStrategy>
    <!-- 关闭状态警告输出,避免刷屏 -->
    <statusListener class="ch.qos.logback.core.status.NopStatusListener" />
    <!-- 原有其他配置 -->
</appender>

补充:结合Spring Profile离线禁用

如果能提前预知离线环境,可通过Spring Profile直接禁用Logstash Appender:

<!-- 非online环境下关闭Logstash Appender -->
<springProfile name="!online">
    <logger name="logstash" level="OFF" />
</springProfile>

启动时添加参数spring.profiles.active=offline即可生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:52:39