最近在看nacos源碼,為了方便理解,在源碼中修改參數(shù)和日志參數(shù)
在看nacos client心跳源碼的時(shí)候,為了修改參數(shù)和增加日志,我將com.alibaba.nacos.client.naming.beat.BeatReactor源碼拷貝到了我自己的工程,因?yàn)槭褂玫膌ogback,那么我在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>
代碼執(zhí)行了,但是log打印的數(shù)據(jù)日志沒(méi)有輸出到控制臺(tái),

image.png
檢查了語(yǔ)法是正確的,很這時(shí)候找到com.alibaba.nacos.client.naming.beat.BeatReactor對(duì)應(yīng)的nacos-client-1.1.4.jar,看到j(luò)ar目錄下有個(gè)nacos-logback.xml配置文件

image.png
nacos-client-1.1.4.jar中定義了logger,將com.alibaba.nacos.client.naming寫入到文件中
找到對(duì)應(yīng)的日志文件

image.png
確實(shí)nacos-client-1.1.4.jar中的配置文件生效了,不過(guò)為啥我的工程文件中的
<logger name="com.alibaba.nacos" >
<appender-ref ref="CONSOLE"/>
<level value="INFO"/>
</logger>
不生效?
通過(guò)Debug發(fā)現(xiàn)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中會(huì)最長(zhǎng)路徑原則配置,當(dāng)com.alibaba.nacos.client.naming匹配到了的logger之后會(huì)立即結(jié)束循環(huán),所以<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
結(jié)果符合預(yù)期