Logback
是由log4j
創(chuàng)始人Ceki Gülcü設計的又一個開源日志組件。根據logback
官網上的說明:
Logback is intended as a successor to the popular log4j project, picking up where log4j leaves off.
logback
旨在替代log4j
成為最通用的日志框架美莫。相比log4j
页眯,Ceki重寫了log4j
的內核形成了logback
,這使得在一些關鍵執(zhí)行路徑上logback
的性能相比log4j
提升10倍以上厢呵。而且logback
的初始化內存加載也更小了餐茵。
總所周知slf4j
是一個標準的日志接口,而logback
則是非常標準的實現(xiàn)述吸。以至于未來替換掉logback
非常容易。
這里來看看logback的幾個組件。
appender
appender
是logback中定義輸出位置的組件蝌矛,它明確了日志輸出的位置道批,是控制臺、文件還是數據庫等等入撒。
logback
中兩個最經典的實現(xiàn)就是ConsoleAppender
和FileAppender
了隆豹。除此之外還有很多非常實用的實現(xiàn),例如:等等茅逮。
如果所有現(xiàn)有的實現(xiàn)都不能滿足我們的需求也不要緊璃赡,logback作為slf4j的實現(xiàn)框架,為我們提供了非常好的擴展献雅。
如果我們需要自己實現(xiàn)一個appender碉考,那么我們就新寫一個類,繼承AppenderBase
就可以了挺身。
public class CountingConsoleAppender extends AppenderBase<ILoggingEvent> {
public void append(ILoggingEvent event) {
// export the log to custom place
}
}
Encoder
appender
負責告訴logback把日志送到哪里去侯谁,那么怎么顯示就需要接下來介紹的一些列組件了,其中Encoder
組件負責將日志事件轉換成二進制流的形式傳遞到相應的位置上章钾。
配置中默認使用的Encoder
類型是ch.qos.logback.classic.encoder.PatternLayoutEncoder
墙贱。
layout
Encoder
負責傳遞日志流,而layout
則負責將一條條日志根據我們的習慣轉換成可以閱讀的文字贱傀。這也是我們在配置logback
中最需要自定義的部分了惨撇。
最常見的場景就是我們使用ch.qos.logback.classic.PatternLayout
這個類了。
平時我們在配置中使用的配置pattern
標簽使用的就是這個類府寒。
<pattern>
%d{yyyy-MM-dd HH:mm:ss} |-%-5level ${PID:- } in %-50(%logger[%thread]) : %msg%n
</pattern>
配置中具體的模板轉換詞可以參考logback的說明(http://logback.qos.ch/manual/layouts.html#conversionWord)魁衙。
filter
在logback中,我們可以根據自己的需求定制出相對應的規(guī)則椰棘,過濾掉一些日志纺棺,減少排查時候的錯誤信息。完成這個過濾規(guī)則定制的組件就是filter
邪狞。
每個過濾器都會實現(xiàn)一個decide()
方法祷蝌,這個方法會返回一個FilterReply
枚舉類對象,FilterReply
中有DENY帆卓,NEUTRAL巨朦,ACCEPT三種類型:
- DENY:日志將立即被拋棄不再經過其他過濾器
- NEUTRAL:有序列表里的下個過濾器過接著處理日志
- ACCEPT:日志會被立即處理,不再經過剩余過濾器
filter
中最常用的可能就是LevelFilter
了剑令。LevelFilter
可以幫助過濾指定的日志的等級糊啡。
舉個栗子,比如我在一個APPENDER
組件中放入兩個filter
:
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>NEUTRAL</onMismatch>
</filter>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
這個上面這個配置中吁津,每條日志都會被檢查是不是INFO等級的日志棚蓄,如果是則被接受堕扶,如果不是就被丟給下一個filter
,第二個filter
開始檢查是不是ERROR等級梭依,如果等級是日志則被打印稍算,否則日志就被丟棄。
如果我們自己想去實現(xiàn)一個filter
役拴,可以定義一個繼承ch.qos.logback.classic.filter.Filter
的類糊探。在decide()
類中去寫自己的規(guī)則就可以了。
如果我們希望自己定義的filter
也能像LevelFilter
一樣使用onMatch
和onMismatch
兩個標簽河闰,可以選擇繼承ch.qos.logback.classic.filter.AbstractMatcherFilter
這個類科平。
Spring Boot和logback
Spring Boot
借助成熟的Spring
體系,已經在Java生態(tài)中大紅大紫了姜性,Spring Boot
也將logback
作為了自己的默認日志處理框架瞪慧。
一般情況下logback
的配置文件會被取成logback.xml
,但是Spring Boot中如果需要使用SpringBoot的一些插件污抬,那么需要將插件的配置文件文件名稱設置成logback-spring.xml
,因為logback.xml
加載的時機太早了汞贸,以至于Spring還沒有啟動logback的配置以及完成了。
Spring Boot
主要解決的問題就是配置問題印机,在logback
中原先要讀取配置是比較麻煩的矢腻。
而Spring Boot
提供了一個插件springProperty
:
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
<remoteHost>${fluentHost}</remoteHost>
...
</appender>
這樣配置文件會自動從application.properties
文件中讀取相應的配置,并在logback
中使用這些變量射赛。
針對Spring Boot
一個jar多柑,四處運行 的宗旨,Spring Boot
還提供了一個springProfile
的插件:
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev, staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
這樣logback
就會根據Spring Boot
當時所處的環(huán)境,切換到對應的配置上楣责。