美文网首页
第三方jar中Logger配置不生效解决

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

作者: lixwcqs | 来源:发表于2020-05-11 23:12 被阅读0次

    最近在看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

    结果符合预期

    相关文章

      网友评论

          本文标题:第三方jar中Logger配置不生效解决

          本文链接:https://www.haomeiwen.com/subject/airmnhtx.html