最近在看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
结果符合预期
网友评论