alibaba / nacos

an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.
https://nacos.io
Apache License 2.0
30.1k stars 12.81k forks source link

【求助】Logback中使用logback-kafka-appender和Nacos日志输出产生冲突,请问如何解决? #10046

Closed wxywizard closed 1 year ago

wxywizard commented 1 year ago

Describe the bug 当我在spring boot工程中使用logback-kafka-appender将日志上报至kafka时,工程报错无法启动,分别做了以下尝试仍不能解决。 1.在logback中注释掉logback-kafka-appender相关配置,项目可以启动 2.只有注释掉nacos的相关pom才不会报错

报错提示

Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in com.github.danielwegener.logback.kafka.KafkaAppender[KAFKA-EVENTS] - Appender [KAFKA-EVENTS] failed to append. org.apache.kafka.common.errors.InterruptException: java.lang.InterruptedException
ERROR in com.github.danielwegener.logback.kafka.KafkaAppender[KAFKA-EVENTS] - Appender [KAFKA-EVENTS] failed to append. org.apache.kafka.common.errors.InterruptException: java.lang.InterruptedException
ERROR in com.github.danielwegener.logback.kafka.KafkaAppender[KAFKA-EVENTS] - Appender [KAFKA-EVENTS] failed to append. org.apache.kafka.common.errors.InterruptException: java.lang.InterruptedException
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - 'File' option has the same value "/Users/will/logs/nacos/config.log" as that given for appender [CONFIG_LOG_FILE] defined earlier.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - For more information, please visit http://logback.qos.ch/codes.html#earlier_fa_collision
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[NAMING_LOG_FILE] - 'File' option has the same value "/Users/will/logs/nacos/naming.log" as that given for appender [NAMING_LOG_FILE] defined earlier.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[NAMING_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[NAMING_LOG_FILE] - For more information, please visit http://logback.qos.ch/codes.html#earlier_fa_collision
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[REMOTE_LOG_FILE] - 'File' option has the same value "/Users/will/logs/nacos/remote.log" as that given for appender [REMOTE_LOG_FILE] defined earlier.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[REMOTE_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[REMOTE_LOG_FILE] - For more information, please visit http://logback.qos.ch/codes.html#earlier_fa_collision
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - 'File' option has the same value "/Users/will/logs/nacos/config.log" as that given for appender [CONFIG_LOG_FILE] defined earlier.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[CONFIG_LOG_FILE] - For more information, please visit http://logback.qos.ch/codes.html#earlier_fa_collision
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[NAMING_LOG_FILE] - 'File' option has the same value "/Users/will/logs/nacos/naming.log" as that given for appender [NAMING_LOG_FILE] defined earlier.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[NAMING_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[NAMING_LOG_FILE] - For more information, please visit http://logback.qos.ch/codes.html#earlier_fa_collision
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[REMOTE_LOG_FILE] - 'File' option has the same value "/Users/will/logs/nacos/remote.log" as that given for appender [REMOTE_LOG_FILE] defined earlier.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[REMOTE_LOG_FILE] - Collisions detected with FileAppender/RollingAppender instances defined earlier. Aborting.
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[REMOTE_LOG_FILE] - For more information, please visit http://logback.qos.ch/codes.html#earlier_fa_collision
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
    at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:80)
    at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
    at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:118)
    at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:306)
    at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:281)
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:239)
    at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
    at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:80)
    at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53)
    at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:342)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1247)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1236)
    at cn.com.crland.roomsource.YouthaOperationsRoomSourceApplication.main(YouthaOperationsRoomSourceApplication.java:16)

logback 配置

 <?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="10 seconds">
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <property scope="context" name="appname" value="youtha"/>
    <property scope="context" name="active" value="dev"/>
    <property scope="context" name="brokers" value="10.107.20.82:9092"/>
    <property scope="context" name="topic" value="youtha-log"/>

    <springProperty scope="context" name="appname"
                    source="spring.application.name"
                    defaultValue="youtha"/>
    <springProperty scope="context" name="active"
                    source="spring.profiles.active"
                    defaultValue="dev"/>
    <springProperty scope="context" name="brokers"
                    source="log.kafka.brokers"
                    defaultValue="10.107.20.82:9092"/>
    <springProperty scope="context" name="topic"
                    source="log.kafka.topic"
                    defaultValue="youtha-log"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d %p[%X{SOFA-TraceId},%X{SOFA-SpanId}] [%c-%line]- %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
            <evaluator>
                <expression>
                    boolean shouldLog = logger.contains("ClientWorker");
                    if(shouldLog <![CDATA[&&]]> (level <![CDATA[<=]]> INFO)){
                    return true;
                    }else{
                    return false;
                    }
                </expression>
            </evaluator>
            <OnMismatch>NEUTRAL</OnMismatch>
            <OnMatch>DENY</OnMatch>
        </filter>
    </appender>
<!--    <appender name="FILEOUT" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">-->
<!--            <evaluator>-->
<!--                <expression>-->
<!--                    boolean shouldLog = logger.contains("ClientWorker");-->
<!--                    if(shouldLog <![CDATA[&&]]> (level <![CDATA[<=]]> INFO)){-->
<!--                    return true;-->
<!--                    }else{-->
<!--                    return false;-->
<!--                    }-->
<!--                </expression>-->
<!--            </evaluator>-->
<!--            <OnMismatch>NEUTRAL</OnMismatch>-->
<!--            <OnMatch>DENY</OnMatch>-->
<!--        </filter>-->
<!--        <File>logs/log.log</File>-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--            <fileNamePattern>logs/log.%d{yyyy-MM-dd}.zip</fileNamePattern>-->
<!--            <maxHistory>30</maxHistory>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>-->
<!--                %d %p [%X{SOFA-TraceId},%X{SOFA-SpanId}] [%c-%line]- %msg%n-->
<!--            </pattern>-->
<!--            <charset>UTF-8</charset>-->
<!--        </encoder>-->
<!--    </appender>-->

    <!-- 业务日志:写入kafka -->
    <appender name="KAFKA-EVENTS" class="com.github.danielwegener.logback.kafka.KafkaAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"  charset="UTF-8" >
            <pattern>[${appname}-${active}] %d %p[%X{SOFA-TraceId},%X{SOFA-SpanId}] [%c-%line]- %msg%n</pattern>
        </encoder>
        <topic>${topic}</topic>
        <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy"/>
        <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>
        <producerConfig>bootstrap.servers=${brokers}</producerConfig>
            <producerConfig>retries=1</producerConfig>
            <producerConfig>batch-size=16384</producerConfig>
            <producerConfig>buffer-memory=33554432</producerConfig>
            <producerConfig>properties.max.request.size==2097152</producerConfig>
    </appender>

    <appender name="ASYNC-KAFKA" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>2048</queueSize>
        <includeCallerData>true</includeCallerData>
        <appender-ref ref="KAFKA-EVENTS"/>
    </appender>

    <logger name="MybatisSql" level="DEBUG" />
    <!-- 控制台输出日志级别 -->
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
<!--        <appender-ref ref="ASYNC-LOCAL"/>-->
        <appender-ref ref="ASYNC-KAFKA"/>
    </root>

</configuration>

Desktop (please complete the following information):

Additional context 参考之前有人提出的将logback的scan="true"参数改为false,尝试之后仍然会报同样错,请问这个问题是需要升级nacos版本吗?

KomachiSion commented 1 year ago

看起来是应用程序多次加载了nacos的日志,可以试着升级一下nacos的客户端版本试试。

hujun-w-2 commented 1 year ago

如果升级nacos的客户端之后还不行的话,可以提供一个可以复现的最简demo

KomachiSion commented 1 year ago

No more response from author, and community can't reproduce problem.

taeyangee commented 11 months ago

引入loki4j-logback 出现同样的问题 https://loki4j.github.io/loki-logback-appender/#quick-start