The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j.
SLF4J是為java logging提供的接口,其具體實現(xiàn)有java.util.logging, logback和log4j肛捍。使用該接口拙毫,只需要導(dǎo)入library slf4j-api-1.7.21.jar。 log4j是apache提供的開源日志組件峭跳,而logback擁有更好的屬性,用來取代log4j點日志組件蛀醉,為slf4j的原生實現(xiàn)拯刁。
每種實現(xiàn)java.util.logging, logback 和 Apache log4j都可以單獨使用或綁定slf4j使用。當(dāng)開發(fā)通用軟件時割捅,最好使用綁定slf4j使用的方式棺牧,這樣允許在后臺使用任何一種實現(xiàn),而不限定于某一種實現(xiàn)颊乘。而且乏悄,slf4j中提供{}占位符恳不,省略字符串拼接以及生成字符串的開銷。
logback相對于log4j點優(yōu)勢:1. 更快的實現(xiàn)规求,更少的內(nèi)存使用阻肿;2. 經(jīng)過更多的測試沮尿;3. logback-classic 為slf4j的native implement畜疾;4. 自動重載改動過的配置文件;5. 優(yōu)雅地從I/O錯誤中恢復(fù)啡捶;6. RollingFileAppender能過自動壓縮archived log files瞎暑,異步實現(xiàn)忿偷,不影響logging臊泌;7. logbook支持conditional processing of configuration file,使用<if>,<else>,<then>等元素實現(xiàn)單個configuration file應(yīng)用于不同環(huán)境渠概;8. 可以更細粒度的指定不同人使用不同的log level播揪;9. 指出exception發(fā)生時使用的lib version筒狠。更多參照
log4j的正常運行需要配置文件,可以是log4j.xml或log4j.properties雇庙。日志的輸出級別:FATAL,ERROR,WARN,INFO,DEBUG 灶伊。樣例參考
slf4j綁定logback的方法類似于log4j,<configuration>中包含各種<appender>竹椒,并在<root>中指定log level 以及使用的appender胸完。樣例參考
下面是對logback manual的知識總結(jié)翘贮。logback manual
logger優(yōu)點:1. 分成不同log request level和logger level,使得在不同環(huán)境打印出不同的log信息誓琼,便于non-prod環(huán)境調(diào)試信息腹侣,以及prod環(huán)境打印較少的必要信息齿穗; 2. 有不同的appender窃页,將log 信息輸出到不同的destination复濒; 3. log info使用{}的format巧颈,避免string拼接的開銷砸泛。
使用logback-classic需要的jar包:slf4j-api.jar,logback-core.jar以及l(fā)ogback-classic.jar蛆封。logback的3個主要class:Logger, Appender, Layout.
當(dāng)logback沒有提供默認的配置文件時惨篱,logback會向root logger中添加ConsoleAppender砸讳。Appender可以理解為output destination,可以為console, files, Syslog, TCP Sockets, JMS and many more吏奸。用戶也可以創(chuàng)建適合自己的Appender陶耍。
使用logger僅需3個步驟:1. 配置logback的配置文件; 2. 在需要打印log的類中用類名生成logger instance泊碑;3. 調(diào)用log instance的函數(shù)debug(), info(), warn(), error()來輸出log信息到Appender毯欣。
Logging API相對于println的優(yōu)勢在于能夠disable某些log statement的同時保留某些log statement馒过。Logger的name大小寫敏感并遵循層次命名規(guī)則(hierarchical name rule)腹忽。logger com.foo是logger com.foo.bar的父類舍哄。
Logger level: TRACE,DEBUG,INFO,WARN,ERROR挺邀。若logger沒有定義log level米同,則使用最近的父類的log level摔竿。root logger的默認log level為DEBUG继低。每個logging request使用logger的函數(shù)info(),debug)來標示logging request的log level郁季。當(dāng)logging request的log level高于或等于logger level時,則該logging request被enabled似枕。TRACE<DEBUG< INFO< WARN<ERROR
logback 環(huán)境的配置發(fā)生在程序初始化的過程中凿歼,傾向于通過讀取配置文件的方式褪迟。
Appender:
logback允許將logging request輸出到多個不同的destination,也稱為appender答憔,包括console味赃,文件,遠程server虐拓,database等心俗。
下面的log request statement,不管debug有沒有被enabled蓉驹,都會有String拼接的開銷城榛。
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
而下面的log request statement,只有在debug被enabled時态兴,才會用entry object替換其中的{}狠持。
logger.debug("The entry is {}.", entry);
當(dāng)log request中存在更多的參數(shù)時,可以使用object[]瞻润。
Object[] paramArray = {newVal, below, above};
logger.debug("Value {} was inserted between {} and {}.", paramArray);
可以通過將root logger的log level設(shè)置為Level.OFF來關(guān)閉logging。
logback配置自己的步驟:先后在classpath中尋找文件logback-test.xml昭齐,logback.groovy就谜, logback.xml,若都沒有找到虹统,則使用BasicConfigurator來自動配置自己,將log輸出到console。而且root logger的默認log level為DEBUG珠增。
使用system property “l(fā)ogback.configurationFile” 可以設(shè)置默認的log back configuration file. 如: java -Dlogback.configurationFile=/path/to/config.xml MyApp1
將<configuration> element的debug屬性設(shè)置為true使得log request始終打印status data: <configuration debug="true">脆荷。將scan屬性設(shè)置為true,使得能夠自動識別log configuration file的改動并自動重載届氢,默認的自動掃描間隔是1分鐘型将,可以通過scanPeriod來設(shè)置:<configuration scan="true" scanPeriod="30 seconds">
發(fā)生exception時丸凭,會打印stack trace,可以在stack trace中包含package info汽烦,包含函數(shù)所屬的jar包及version信息,有助于識別version問題。但當(dāng)exception頻繁出現(xiàn)時,開銷較大。package data默認時關(guān)閉的都毒,可以通過<configuration packagingData="true">來打開。
配置文件<configuration>中包含0個或多個<appender>元素,緊跟著0個或多個<logger>元素,跟著最多一個<root>元素禀晓。<logger>元素必須有一個name屬性顷级,level屬性為optional,可以為TRACE,DEBUG,INFO,WARN,ERROR,ALL or OFF爬迟,也可以設(shè)置為INHERITED 或 NULL表示從上層logger獲取level跌捆。<logger>元素中可以有0個或多個<appender-ref>元素。<root>元素配置root logger潮瓶,只有屬性level,不能為INHERITED或NULL思恐,<root>元素中也可以有0個或多個元素婚温。
<appender>元素存在2個必需屬性name和class嵌巷,其中包含0個或1個<layout>元素,0個或多個<encoder>元素和0個或多個<filter>元素兽泄。
logger將向自己attached的appender及其父類的appender輸出log蜓陌。若設(shè)置logger的屬性additivity為false隧期,則不會向其父類輸出log遣臼。
logger configuration file中底變量類似于unix shell,使用${}表示,并會用值替代。變量可以在configuration file中指定,如:<property name="USER_HOME" value="/home.xiangyuw " />或使用system property派诬,如: java -DUSER_HOME="/home/xiangyuw". 當(dāng)變量比較多時曲掰,最好從property file中獲取底哥,如:<property file="variables.properties" /> 翰守。獲取變量值時,先從local獲取,之后context范圍谊囚,之后system property函筋,最后OS environment灌诅。也可以為變量設(shè)置default值,如:${color:-red}。
configuration file中可以使用條件語句:<if><then></then><else></else></if>肥惭。
我們可以在configuration file中使用元素<include>引入其他的configuration file牵囤。如:<include file="ado-configuration.xml" />野崇。也可以使用resource和url等屬性來引入:<include resource="*.xml" />,<include url="http://path/*.xml" />
現(xiàn)在看完configuration,后面的appender鹦马,繼續(xù)參見logback manual.