Log in Java

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.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末退疫,一起剝皮案震驚了整個濱河市渠缕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褒繁,老刑警劉巖亦鳞,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棒坏,居然都是意外死亡燕差,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門坝冕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來徒探,“玉大人,你說我怎么就攤上這事喂窟〔獍担” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵谎替,是天一觀的道長偷溺。 經(jīng)常有香客問我,道長钱贯,這世上最難降的妖魔是什么挫掏? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮秩命,結(jié)果婚禮上尉共,老公的妹妹穿的比我還像新娘。我一直安慰自己弃锐,他們只是感情好袄友,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霹菊,像睡著了一般剧蚣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上旋廷,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天鸠按,我揣著相機與錄音,去河邊找鬼饶碘。 笑死目尖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扎运。 我是一名探鬼主播瑟曲,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼饮戳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞拨?” 一聲冷哼從身側(cè)響起扯罐,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎烦衣,沒想到半個月后篮赢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡琉挖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年启泣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片示辈。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寥茫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矾麻,到底是詐尸還是另有隱情纱耻,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布险耀,位于F島的核電站弄喘,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏甩牺。R本人自食惡果不足惜蘑志,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望贬派。 院中可真熱鬧急但,春花似錦、人聲如沸搞乏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽请敦。三九已至镐躲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侍筛,已是汗流浹背萤皂。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勾笆,地道東北人敌蚜。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓桥滨,卻偏偏與公主長得像窝爪,于是被迫代替她去往敵國和親弛车。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容