2010/04/07 — Unmi前面講的 SLF4J 的用法之一是 SLF4J+Log4J,而這里要推出的組合是 SLF4J+LogBack。不用 Log4J?難道還有比 Log4J 更好的日志實(shí)現(xiàn)嗎?是的,答案就是
LogBack。假如你知道 LogBack 和 Log4J 是同出一位大師之手,你就不會(huì)覺得驚訝了。LogBack 對(duì) Log4J 進(jìn)行了增強(qiáng),并投入了 SLF4J 的懷抱,它還被作者認(rèn)定為 Log4J 的繼任者。
為什么叫做 Logback,我就不知道了,反正不要叫做 Brokeback 就行。這里是推崇用 Logback 替代 Log4J 的十幾個(gè)理由:
Reasons to prefer logback over log4j,說的大至是更快;好測(cè)試;與 SLF4J 關(guān)系緊;文檔豐富;能自動(dòng)加載配置文件;多個(gè) JVM 寫一個(gè)日志文件,或其他 I/O 錯(cuò)誤時(shí)不影響程序執(zhí)行;配置文件中加入條件控制;強(qiáng)大的日志過濾;更強(qiáng)的日志切分功能;自動(dòng)壓縮、刪除日志文件;異常棧中更多的數(shù)據(jù)信息。
Logback 分為三個(gè)模塊:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身實(shí)現(xiàn)了 SLF4J API,所以即使用 Logback 你仍然可以使用其他的日志實(shí)現(xiàn),如原始的 Log4J,java.util.logging 等;logback-access 讓你方便的訪問日志信息,如通過 http 的方式。
還得提一點(diǎn),Logback 能更好的放到 OSGI 環(huán)境中。好了,簡單紹完了 Logback,就來看看具體怎么用它。
需要的配置文件和組件包,下面三個(gè) jar 文件和一個(gè) xml文件都是要放在項(xiàng)目的 ClassPath 上。
1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml (類似于 log4j.properties/log4j.xml)
前一個(gè)包在
http://www.slf4j.org/download.html 處下載,第二第三個(gè)包在
http://logback.qos.ch/download.html 下載,可能包文件名中的版本號(hào)有些差,不要緊。由于這里不演示 HTTP 訪問日志信息,所以不需要用到 logback-access-0.9.20.jar。
Logback 先找 logback-test.xml,沒有則找 logback.xml 文件,都找不到就使用 BasicConfigurator 基本配置,BasicConfigurator 就是相當(dāng)于等會(huì)貼出的 logback.xml 文件內(nèi)容的配置。這里我們用 logback.xml 配置文件,以前的 log4j.properties 文件可以用
PropertiesTranslator 轉(zhuǎn)換成 logback.xml 文件內(nèi)容。
下面是一個(gè)最簡單的 logback.xml 文件內(nèi)容
01<?xml version="1.0" encoding="UTF-8"?>
02<configuration>
03 <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
04 <encoder charset="GBK">
05 <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
06 </encoder>
07 </appender>
08
09 <root level="DEBUG">
10 <appender-ref ref="stdout" />
11 </root>
12</configuration>
在 log4j.xml 能做的配置,logback.xml 中也能做到,而且還增強(qiáng)了諸如 <if><then><else>、<filter>、<sift> 等更強(qiáng)的控制,請(qǐng)參考 logback 的手冊(cè)
http://logback.qos.ch/manual/index.html。
使用 Logback 的代碼
01package com.unmi;
02
03import org.slf4j.Logger;
04import org.slf4j.LoggerFactory;
05
06public class TestLogback {
07 private static final Logger logger = LoggerFactory.getLogger(TestLogback.class);
08
09 public static void main(String[] args) {
10 logger.info("Hello {}","TestLogback");
11 }
12}
可以看到與使用 SLF4J 的代碼沒有任何區(qū)別,因?yàn)楸緛碛玫耐ㄓ萌罩究蚣芫褪?SLF4J,說到底,這里的 Logback 就相當(dāng)于 SLF4J+Log4J 使用方式中的 Log4J 綁定和 Log4J 的功能。
執(zhí)行上面的代碼,輸出:
21:38:43.031 [main] INFO com.unmi.TestLogback - Hello TestLogback
還是和上次一樣,這里就拿 SLF4J+Logback 和 SLF4J+Log4J 兩種方式作下比較:
SLF4J+Logback 組合對(duì)比SLF4J+Log4J 組合
slf4j-api-1.5.11.jar一樣的,定義高層 APIslf4j-api-1.5.11.jar
logback-classic-0.9.20.jar都是用綁定,
左邊這里用作
Logback 綁定slf4j-log4j12-1.5.11.jar
logback-classic-0.9.20.jar左邊這里用作
日志實(shí)現(xiàn)log4j-1.2.15.jar
logback-test.xml/logback.xml相當(dāng),logback 增加
了 log4jlog4j.properties/log4j.xml
程序代碼中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(TestSlf4j.class);
logger.info("Hello {}","SLF4J");
完全一樣,實(shí)質(zhì)上只是
SLF4J API
侵入到了應(yīng)用組件
中了,與 Logback
沒有關(guān)系。程序代碼中:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(TestLogback.class);
logger.info("Hello {}","Logback");
通過上面我們更清楚的發(fā)現(xiàn),SLF4J+Logback 這樣的組合與 SLF4J+Log4J 這樣的用法其實(shí)沒有什么差異。SLF4J 在使用其他日志實(shí)現(xiàn)框架的時(shí)候都是 SLF4J+相應(yīng)綁定+日志實(shí)現(xiàn),這里縮寫成的 SLF4J+Log4J,中間是有一個(gè) SLF4J 到 Log4J 的綁定的。完整表述它們就是:
SLF4J+Log4J 的方式: slf4j-api-1.5.11.jar + slf4j-log4j12-1.5.11.jar + log4j-1.2.15.jar
SLF4J+Logback 的方式:slf4j-api-1.5.11.jar + logback-classic-0.9.20.jar + logback-classic-0.9.20 前一個(gè) logback-classic-0.9.20.jar 是作為綁定用的,后一個(gè)是作為日志實(shí)現(xiàn)用的,也就是 logback-classic-0.9.20.jar 把前面的 slf4j-log4j12-1.5.11.jar 和 log4j-1.2.15.jar 兩個(gè)包的功能揉合在了一起。
搞明白了 Logback 在其中所擔(dān)當(dāng)?shù)慕巧?,我們就知道,說使用了 Logback 應(yīng)用組件,實(shí)際它們所用的統(tǒng)一日志組件只是 SLF4J。也可以說 Logback 就是 Log4J 那樣,只是自身帶了綁定的日志實(shí)現(xiàn)。
在 Logback 官方首頁
http://logback.qos.ch/ 面中可以看到使用了 Logback 的項(xiàng)目。
本文鏈接
http://unmi.cc/slf4j-logback, 來自
隔葉黃鶯 Unmi's Blog[版權(quán)聲明]本站內(nèi)文章,如未特別注明,均系原創(chuàng)或翻譯之作,本人 Unmi 保留一切權(quán)利。本站原創(chuàng)及譯作未經(jīng)本人許可,不得用于商業(yè)用途及傳統(tǒng)媒體。網(wǎng)絡(luò)媒體可隨意轉(zhuǎn)載,或以此為基礎(chǔ)進(jìn)行演譯,但務(wù)必以鏈接形式注明原始出處和作者信息,否則屬于侵權(quán)行為。另對(duì)本站轉(zhuǎn)載他處文章,俱有說明,如有侵權(quán)請(qǐng)聯(lián)系本人,本人將會(huì)在第一時(shí)間刪除侵權(quán)文章。及此說明,重之之重。
相關(guān)文章:
Log4j是輸出日志時(shí)是如何獲知當(dāng)前方法、行號(hào)的關(guān)于 Log4j 比較全面的配置常用log4j配置新一代通用日志框架 SLF4J 用戶指南SLF4J 的幾種實(shí)際應(yīng)用模式--之一:SLF4J+Log4J