什么是 logback
Logback 為取代 log4j 而生。
Logback 由 log4j 的創立者 Ceki Gülcü 設計。以十多年設計工業級記錄系統的經驗為基礎,所創建的 logback 比現有任何記錄系統更快、占用資源更少,有時差距非常大。
Logback 提供獨特而實用的特性,比如 Marker、參數化記錄語句、條件化堆棧跟蹤和強大的事件過濾功能。以上列出的僅僅是 logbook 實用特性的一小部分。
對於自身的錯誤報告,logback 依賴狀態(Status)對象,狀態對象極大地簡化了故障查找。你也許想在上下文中使用狀態對象而不是記錄。
Logback-core 附帶了 Joran,Joran 是個強大的、通用的配置系統,你可以在自己的項目里使用 Joran 以獲得巨大的作用。
第一步
必要條件
Logback-classic 依賴 slf4j-api.jar 和 logback-core.jar。
現在讓我們開始體驗 logback。
示例 1.1:記錄基本模版
(logback-examples/src/main/java/chapters/introduction/HelloWorld1.java)
package chapters.introduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld1 {
public static void main(String[] args) {
Logger logger = LoggerFactory
.getLogger("chapters.introduction.HelloWorld1");
logger.debug("Hello world.");
}
}
HelloWorld1 類導入了 SLF4J API 定義的 Logger 類和 LoggerFactory 類,更明確地說是定義在 org.slf4j 包里的兩個類。
main()方法的第一行里,調用 LoggerFactory 類的靜態方法 getLogger 取得一個 Logger實例,將該實例賦值給變量logger。這個 logger被命名為“chapters.introduction.HelloWorld1”。
main 方法繼續調用這個 logger 的 debug 方法並傳遞參數“Hello world”。我們稱之為 main方法包含了一條消息是“Hello world”、級別是 DEBUG 的記錄語句。
注意上面的例子並沒有引用任何 logback 的類。多數情況下,只要涉及到記錄,你只需要引用 SLF4J 的類。因此在絕大多數情況下,你的類只導入 SLF4J 的 API,基本可以忽略logback 的存在。
運行示例程序:
java chapters.introduction.HelloWorld1
運行后會在控制台輸出下面的一行文字。得益於 logback 提供了默認配置策略,當沒有發現默認配置文件時,logback 會為根(root) logger 添加一個 ConsoleAppender。
20:49:07.962 [main] DEBUG chapters.introduction.HelloWorld1 - Hello world.
Logback 可以通過內置的狀態系統來報告其內部狀態。通過 StatusManager 組件可以訪問 logback 生命期內發生的重要事件。目前,我們調用 StatusPrinter 類的 print()方法來打印logback 的內部狀態。
示例 1.2:打印 Logger 狀態
(logback-examples/src/main/java/chapters/introduction/HelloWorld2.java)
package chapters.introduction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
public class HelloWorld2 {
public static void main(String[] args) {
Logger logger = LoggerFactory
.getLogger("chapters.introduction.HelloWorld2");
logger.debug("Hello world.");
// print internal state
LoggerContext lc = (LoggerContext)
LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
}
}
運行后輸出如下:
12:49:22.203 [main] DEBUG chapters.introduction.HelloWorld2 - Hello world.
12:49:22,078 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
resource [logback-test.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find
resource [logback.xml]
12:49:22,093 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default
configuration.
Logback 說它沒有找到配置文件 logback-test.xml 和 logback.xml(稍后解釋),於是用默認策略進行配置,即用一個基本的 ConsoleAppender。Appender 類可被視為輸出目的地的。
Appender 包含許多不同類型的目的地,包括控制台、文件、Syslog、TCP 套接字、JMS 和其他。用戶可以很容易地自定義 Appender。
當發生錯誤時,logback 將自動在控制台上打印其內部狀態。
之前的兩個示例相當簡單,大型程序里真實記錄志情況也不會有太大區別。記錄系統的基本模式不會改變,可能改變的是配置過程。也許你想按照自己的需要來定制或配置 logback,之后的章節會討論配置 logback。
在上面的例子里,我們調用 StatusPrinter.pring()方法來打印 logback 的內部狀態。在診斷與 logback 相關的問題時,logback 的內部狀態信息會非常有用。
在應程序里啟用記錄的三個必需步驟如下:
- 配置 logback 環境。方法有繁有簡,稍后討論。
- 在每個需要執行記錄的類里,調用 org.slf4j.LoggerFactory 類的 getLogger()方法獲取一個 Logger 實例,以當前類名或類本身作為參數。
- 調用取得的 logger 實例的打印方法,即 debug()、info()、warn()和 error(),把記錄輸出到配置里的各 appender。
構建 logback
Logback 使用 Maven2 進行構建。
安裝 Maven2 后,解壓 logback 發行包,在解壓后的目錄下執行 mvn package 命令,就可以構建整個 logback 項目,包括各個模塊。Maven 會自動下載所需外部類庫。
Logback 發行包包含完整的源代碼,你可以修改源代碼,創建自己的版本。你還可以發布修改過的版本,前提是遵守 LGPL 或 EPL。
Logback 在以下 JDK 進行過構建和測試。
JDK | Operating System | |||
Sun JDK 1.5.0.06 | Windows XP | |||
Sun JDK 1.5.0.08 | Linux 64bit AMD | |||
WebLogic JRockit 1.5.0.14 | Linux 64bit AMD | |||
IBM JDK 1.6.0.1 | Linux 64bit AMD | |||
Sun JDK 1.6.0.16 (64 bit) | Windows 7 (64 bit) |