由日誌打不出引出的知識圖譜(一)

由日誌打不出引出的知識圖譜(一)

當咱們調用Logger.error的時候發生了什麼

目前業界日誌標配slf4j + logback,當咱們調用slf4j的Logger.error()的時候到底發生了什麼?貼一張Logger執行流程圖
clipboard.png
這裏出現了一個關鍵對象AppenderAttachableImpl,若是Logger的局部變量值爲null,就調用父Logger進行日誌打印,結合實際場景解釋一下app

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="TEST"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
          .....
    </appender>

    <appender name="BIZ_LOG"
          class="ch.qos.logback.core.rolling.RollingFileAppender">
          .....
    </appender>

    <logger name="bizLogger" level="INFO" additivity="false">
        <appender-ref ref="BIZ_LOG"/>
    </logger>
    
    <root level="INFO">
        <appender-ref ref="TEST"/>
    </root>
</configuration>

上述是某個工程的logback.xml的配置文件,AppenderAttachableImpl就是配置中的appender元素節點的抽象,那麼對若是Logger局部變量AppenderAttachableImplnull,則調用父Logger,這裏的父Logger就是表明ROOT節點的Logger實例 spa

接下來關注另一個問題Logger局部變量AppenderAttachableImpl什麼才爲null,來看下Logger的建立過程,根據Logger logger = LoggerFactory.getLogger("name");定位到類ch.qos.logback.classic.LoggerContext構造方法
clipboard.png
在構造方法中建立了ROOT Logger實例,接下來看下實際建立Logger實例代碼
clipboard.png
若是loggerCache存在對應實例則直接返回,若是ROOT-Logger.getChildByName找不到對應nameLogger,就建立一個Logger
clipboard.png
這裏能夠看出建立的Logger實例的父Logger就是ROOT-Logger,可是在建立的時候並無涉及到AppenderAttachableImpl的賦值.接下來再探索一下,AppenderAttachableImpl的賦值過程(基於SpringBoot)
直接定位到初始化類ch.qos.logback.classic.joran.action.LoggerAction
clipboard.png
ch.qos.logback.core.joran.action.AppenderRefAction
clipboard.png
在解析logback.xml在解析到<logger>元素的時候會建立相應Logger實例,而且若是有<appender-ref>子元素,就給實例的AppenderAttachableImpl賦值日誌

相關文章
相關標籤/搜索