是否可以擴展一下logback康栈,來實現(xiàn)自己的logger api,使得打印更加容易析藕,一些關(guān)鍵信息是內(nèi)置打印的呢慷垮?
logback的三大模塊(logback-core, logback-classic and logback-access):
- logback-core:是最基礎(chǔ)的模塊,提供了logback的基礎(chǔ)架構(gòu)實現(xiàn)
- logback-classic:提供了core的擴展句灌,實現(xiàn)了slf4j的接口夷陋。增加了log4j的功能
- logback-access:一個集成servlet容器提供http 請求日志的記錄功能的模塊。
我們平時用到的主要是logback-classic模塊里面的功能
關(guān)于Appender
對于logback來說胰锌,一個日志輸出的目的地被稱作為appender骗绕。一個logger可以有多個appender。
如果頂層的logger资昧,如rootLogger配置了一個console的appender酬土,當(dāng)下面一個子logger,比如org.apache配置的是一個file的appender格带。那么這個org.apache的logger撤缴,同時會具有從rootLogger繼承過來的console appender,以及其單獨設(shè)置的file appender叽唱,可以通過設(shè)置additivity flag 為false(默認是true) 來屏蔽父輩的appender繼承屈呕。一圖剩千言:
The table below shows an example:
打印日志時的代碼邏輯
我們來分析一下,當(dāng)調(diào)用一個logger的info方法之后尔觉,logback是怎么執(zhí)行的凉袱,先看一下時序圖:
1、Get the filter chain decision (這個沒想到翻譯成什么):
TurboFilter 可以設(shè)置一些上下文變量,或者過濾一些日志信息专甩,比如Marker, Level, Logger, message, or the Throwable等钟鸵。TurboFilter 會返回一下三種判斷結(jié)果:
- FilterReply.DENY:整個日志打印請求就會丟棄,終止打印
- FilterReply.NEUTRAL:跳到第二步執(zhí)行涤躲,進一步判斷是否要打印日志
- FilterReply.ACCEPT:跳到第三步棺耍,構(gòu)造打印日志對象
2、Apply the basic selection rule
更加基礎(chǔ)的規(guī)則對日志進行過濾种樱,比如如果設(shè)置了warn基本的日志蒙袍,那么info日志是不會被輸出的。
3嫩挤、Create a LoggingEvent object
在這一步中害幅,會使用日志打印所需要的所有相關(guān)的信息,以及MDC信息來創(chuàng)建一個LoggingEvent對象岂昭。LoggingEvent對象的所有field都是延遲加載的以现,當(dāng)需要用到的時候才會被初始化(這個是怎么做的呢?)
4约啊、Invoking appenders
5邑遏、 Formatting the output
6、Sending out the LoggingEvent