ELK日志代理上传:Springboot-Kafka启动问题

通过ELK代理上传日志时,配置Logback的kafkaAppender,Springboot启动会加载logback.xml,具体logback的配置另行查询百度,kafka连接集群,根据Producer Metadata更新机制获取元数据,同时创建生产者推送消息到Logstash,此时如果连接不到kafka集群,就会一直请求获取元数据,直到60s超时,即程序启动会堵塞60s

通常会报:org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms

Kafka Producer Metadata更新策略可以参考:
https://matt33.com/2017/07/08/kafka-producer-metadata/

以下是一些关键代码:

 

不多说,上代码:

<!-- This is the kafkaAppender -->
<appender name="KafkaAppender" class="com.github.danielwegener.logback.kafka.KafkaAppender">
    <encoder>
        <!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{5} %X{uri} %X{requestId} %X{agentId} - %msg%n</pattern>
    </encoder>
    <topic>${KAFKA-TOPIC}</topic>
    <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy" />
    <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy" />
    <producerConfig>bootstrap.servers=${KAFKA-BROKER}</producerConfig>
    <!-- 这个是获取元数据的最大堵塞时间,也可以修改这个参数解决问题,但不推荐 -->
    <!-- <producerConfig>max.block.ms=3000</producerConfig>-->
    <!-- this is the fallback appender if kafka is not available. -->
    <appender-ref ref="STDOUT" />
</appender>

<!-- 使用 logback 自己的 AsyncAppender包装 KafkaAppender,避免无法获取Kafka元数据时阻塞主程序.
    参考:https://github.com/danielwegener/logback-kafka-appender#note-on-broker-outages -->
<appender name="AsyncKafKaAppender" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="KafkaAppender" />
</appender>

基本上这样就能解决问题,但这个会引入一个新的问题,因为Springboot自带logging,且启动顺序在Logback之前

org.springframework.boot.context.logging.LoggingApplicationListener#initializeSystem
在这个方法里面会加载Logback.xml,此时KafkaAppender还未加载,如果此时springboot内部有日志输出,调用KafkaAppender推送日志,则会启动报错,如图:


org.springframework.boot.logging.AbstractLoggingSystem#getSelfInitializationConfig
从这个方法可以看到,springboot会自动查找名字为{"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"}的配置文件,如果这些查不到,会在后面加上-spring继续查找,如:logback-spring.xml
 

解决方法:修改logback.xml的文件名为 logback-***.xml,***不能为spring,这样springboot启动时,LoggingSystem就不会加载logback.xml

注意:bootstrap.properties或application.properties需要加上配置,logging.config=classpath:logback-***.xml,*** 替换为自己的命名

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值