第三方jar中Logger配置不生效解决

最近在看nacos源码,为了方便理解,在源码中修改参数和日志参数
在看nacos client心跳源码的时候,为了修改参数和增加日志,我将com.alibaba.nacos.client.naming.beat.BeatReactor源码拷贝到了我自己的工程,因为使用的logback,那么我在xml配置代码如下

   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <root>
        <level value="offer"/>
        <!--<appender-ref ref="rootFile"/>-->
        <appender-ref ref="CONSOLE"/>
    </root>
    <logger name="com.alibaba.nacos" >
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

代码执行了,但是log打印的数据日志没有输出到控制台,


image.png

检查了语法是正确的,很这时候找到com.alibaba.nacos.client.naming.beat.BeatReactor对应的nacos-client-1.1.4.jar,看到jar目录下有个nacos-logback.xml配置文件


image.png

nacos-client-1.1.4.jar中定义了logger,将com.alibaba.nacos.client.naming写入到文件中
找到对应的日志文件


image.png

确实nacos-client-1.1.4.jar中的配置文件生效了,不过为啥我的工程文件中的
    <logger name="com.alibaba.nacos" >
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>

不生效?

通过Debug发现ch.qos.logback.classic.Logger类中

public void callAppenders(ILoggingEvent event) {
       int writes = 0;
       for (Logger l = this; l != null; l = l.parent) {
           writes += l.appendLoopOnAppenders(event);
           if (!l.additive) {
               break;
           }
       }
       // No appenders in hierarchy
       if (writes == 0) {
           loggerContext.noAppenderDefinedWarning(this);
       }
   }

   private int appendLoopOnAppenders(ILoggingEvent event) {
       if (aai != null) {
           return aai.appendLoopOnAppenders(event);
       } else {
           return 0;
       }
   }
image.png

logger中会最长路径原则配置,当com.alibaba.nacos.client.naming匹配到了的logger之后会立即结束循环,所以<logger name="com.alibaba.nacos" >是不生效的,知道原理之后,在工程的配置文件中增加配置

    <logger name="com.alibaba.nacos.client.naming" level="${com.alibaba.nacos.naming.log.level:-info}"
            additivity="false">
        <appender-ref ref="CONSOLE"/>
        <level value="INFO"/>
    </logger>
image.png
image.png

结果符合预期

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容