如何在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配置实现以下两种效果之一:
- 能连接Logstash就使用该Appender,无法连接则自动禁用
- 重试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
相关产品推荐
相关产品推荐

