標籤:com 定義 簡單的 速度 [1] 產生 根據 output figure
什麼是log4j?
- log4j 是一個協助程式員將日誌語句輸出到各種輸出目標的工具。
- log4j 包的設計使得日誌語句可以保留在發行的代碼中,而不會產生高效能成本。
- log4j 使用
分層記錄器可以有選擇地控制以任意粒度輸出哪些日誌語句。
- log4j 的設計考慮了三個目標:
可靠性、速度 和 靈活性。
log4j是一個可靠的日誌系統嗎?
??不是。log4j 不可靠。它是一種儘力而為的故障停止記錄系統。
??通過失敗停止,log4j 不會在運行時拋出意外的異常,從而可能導致應用程式崩潰。
??此外,當 log4j 的指定輸出資料流未開啟,不可寫或變滿時,log4j 將不會恢複為System.out 或 System.err。這樣可以避免因為日誌記錄失敗而覆蓋使用者終端而損壞其他工作程式。但是,log4j 將向System.err輸出單個訊息,指示無法執行日誌記錄。
log4j有什麼特點?
- log4j 針對
速度進行了最佳化。
- log4j 基於命名的記錄器階層。
- log4j 是失敗停止,但並不保證每個日誌語句都將傳遞到其目的地。
- log4j 是
安全執行緒的,Log4j 組件設計用於大量多線程系統。
- log4j 設定檔可以是
屬性檔案或XML格式。
- log4j 旨在從一開始就處理 Java Exceptions。
- log4j 可以將其輸出定向到
檔案、控制台、java.io.OutputStream、java.io.Writer、使用 TCP 的遠程伺服器、遠程 Unix Syslog 精靈、使用 JMS 的遠程接聽程式、NT EventLog、電子郵件。
- log4j 使用 6 個層級:即
TRACE,DEBUG,INFO,WARN,ERROR和FATAL。等級:DEBUG < INFO < WARN < ERROR < FATAL。
- 通過擴充
Layout類可以輕鬆變更記錄檔輸出的格式。
- 通過
Appender介面的實現來變更記錄檔輸出的目標以及寫入策略 。
- log4j 支援每個記錄器輸出多個
appender。
- log4j 支援國際化。
是否有使用log4j的範例程式碼?
??請參閱 examples / 目錄。
日誌輸出是什麼樣的?
??可以通過多種方式自訂日誌輸出。此外,可以通過實現自己的布局完全覆蓋輸出格式。以下是使用PatternLayout的樣本輸出,其轉換模式為:%r [%t]%-5p%c {2}%x - %m%n
176 [main] INFO examples.Sort - 以相反的順序填充2個元素的數組。225 [main] INFO examples.SortAlgo - 輸入排序方法。262 [main] DEBUG SortAlgo.OUTER i = 1 - 外迴圈。276 [main] DEBUG SortAlgo.SWAP i = 1 j = 0 - 交換intArray [0] = 1和intArray [1] = 0290 [main] DEBUG SortAlgo.OUTER i = 0 - 外迴圈。304 [main] INFO SortAlgo.DUMP - 整數數組的轉儲:317 [main] INFO SortAlgo.DUMP - 元素[0] = 0331 [main] INFO SortAlgo.DUMP - 元素[1] = 1343 [main] INFO examples.Sort - 下一個日誌語句應該是錯誤訊息。346 [main] ERROR SortAlgo.DUMP - 嘗試轉儲未初始化的數組。 在org.log4j.examples.SortAlgo.dump(SortAlgo.java:58) 在org.log4j.examples.Sort.main(Sort.java:64)467 [main] INFO examples.Sort - 退出主要方法。
??第一個欄位是自程式啟動以來經過的毫秒數。第二個欄位是輸出日誌語句的線程。第三個欄位是日誌語句的層級。第四個欄位是記錄器發出日誌請求的最右邊的兩個組件。第五個欄位(在‘ - ‘之前)是嵌套診斷上下文(NDC)。請注意,嵌套診斷上下文可能為空白,如前兩個語句中所示。‘ - ‘後面的文本是語句的訊息。
什麼是記錄器?
??Lggers 是 log4j 的核心。記錄器定義階層,並為程式員提供運行時控制,以控制或不列印哪些語句。記錄器被分配層級。根據其層級和記錄器列印日誌語句。
如何在靜態塊中擷取類的完全限定名稱?
package a.b.c;import org.apache.log4j.Logger;public class Foo { final static Logger logger = Logger.getLogger(Foo.class); ... other code}
Log4j的三個主要組件
loggers,appenders和layouts。這三種類型的組件協同工作,使開發人員能夠根據訊息類型和層級記錄訊息,並在運行時控制這些訊息的格式以及報告的位置。
Configuration
import com.foo.Bar; import org.apache.log4j.Logger; import org.apache.log4j.BasicConfigurator; public class MyApp { // 定義靜態記錄器變數,使其引用 // 名為“MyApp”的記錄器執行個體。 static Logger logger = Logger.getLogger(MyApp.class); public static void main(String [] args) { // 設定在控制台上登入的簡單配置。 BasicConfigurator.configure(); logger.info("Entering application."); Bar bar = new Bar(); bar.doIt() logger.info("Exiting application."); } }
??MyApp 首先匯入 log4j 相關類。然後,它定義一個名為 MyApp 的靜態記錄器變數,該變數恰好是該類的完全限定名稱。MyApp 使用com.foo包中定義的 Bar 類。
package com.foo; import org.apache.log4j.Logger; public class Bar { static Logger logger = Logger.getLogger(Bar.class); public void doIt() { logger.debug("Do it again."); } }
??BasicConfigurator.configure方法的調用建立了一個相當簡單的 log4j 設定。此方法是硬連線的,以便將根記錄器添加到 ConsoleAppender 中。輸出將使用 PatternLayout 格式設定為%-4r [%t]%-5p%c%x - %m%n模式。
??請注意,預設情況下,根記錄器分配給Level.DEBUG。
??MyApp 的輸出是:
0 [main] INFO MyApp - Entering application.36 [main] DEBUG com.foo.Bar - Do it again.51 [main] INFO MyApp - Exiting application.
??在 MyApp 的類通過調用配置 log4j 的BasicConfigurator.configure方法。其他類只需要匯入org.apache.log4j.Logger類,檢索他們希望使用的記錄器,然後登出。前面的樣本始終輸出相同的日誌資訊。幸運的是,很容易修改 MyApp,以便在運行時控制日誌輸出。這是一個稍微修改過的版本。
import com.foo.Bar; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class MyApp { static Logger logger = Logger.getLogger(MyApp.class.getName()); public static void main(String[] args) { // 將 BasicConfigurator 替換為 PropertyConfigurator。 PropertyConfigurator.configure(args[0]); logger.info("Entering application."); Bar bar = new Bar(); bar.doIt(); logger.info("Exiting application."); } }
??此版本的 MyApp 指示 PropertyConfigurator 解析設定檔並相應地設定日誌記錄。下面是一個樣本設定檔,其結果與先前基於 BasicConfigurator 的樣本相同。
# 將root logger level設定為DEBUG,將其唯一的appender設定為A1。log4j.rootLogger=DEBUG, A1# A1設定為ConsoleAppender。log4j.appender.A1=org.apache.log4j.ConsoleAppender# A1 使用 PatternLayout.log4j.appender.A1.layout=org.apache.log4j.PatternLayoutlog4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
??假設我們不再對查看屬於 com.foo 包的任何組件的輸出感興趣。以下設定檔顯示了實現此目的的一種可能方法。
log4j.rootLogger = DEBUG,A1log4j.appender.A1 = org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout = org.apache.log4j.PatternLayout#以ISO 8601格式列印日期 log4j.appender.A1.layout.ConversionPattern = %d [%t]%-5p%c - %m%n#在com.foo包中僅列印層級為WARN或更進階別的訊息。log4j.logger.com.foo = WARN
參考手冊
log4j 知識點