log4j 知識點

來源:互聯網
上載者:User

標籤:com   定義   簡單的   速度   [1]   產生   根據   output   figure   

什麼是log4j?
  • log4j 是一個協助程式員將日誌語句輸出到各種輸出目標的工具。
  • log4j 包的設計使得日誌語句可以保留在發行的代碼中,而不會產生高效能成本。
  • log4j 使用分層記錄器可以有選擇地控制以任意粒度輸出哪些日誌語句。
  • log4j 的設計考慮了三個目標:可靠性速度靈活性
log4j是一個可靠的日誌系統嗎?

??不是。log4j 不可靠。它是一種儘力而為的故障停止記錄系統。
??通過失敗停止,log4j 不會在運行時拋出意外的異常,從而可能導致應用程式崩潰。
??此外,當 log4j 的指定輸出資料流未開啟,不可寫或變滿時,log4j 將不會恢複為System.outSystem.err。這樣可以避免因為日誌記錄失敗而覆蓋使用者終端而損壞其他工作程式。但是,log4j 將向System.err輸出單個訊息,指示無法執行日誌記錄。

log4j有什麼特點?
  • log4j 針對速度進行了最佳化。
  • log4j 基於命名的記錄器階層。
  • log4j 是失敗停止,但並不保證每個日誌語句都將傳遞到其目的地。
  • log4j 是安全執行緒的,Log4j 組件設計用於大量多線程系統。
  • log4j 設定檔可以是屬性檔案XML格式。
  • log4j 旨在從一開始就處理 Java Exceptions。
  • log4j 可以將其輸出定向到檔案控制台java.io.OutputStreamjava.io.Writer使用 TCP 的遠程伺服器遠程 Unix Syslog 精靈使用 JMS 的遠程接聽程式NT EventLog電子郵件
  • log4j 使用 6 個層級:即TRACEDEBUGINFOWARNERRORFATAL。等級: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的三個主要組件

loggersappenderslayouts。這三種類型的組件協同工作,使開發人員能夠根據訊息類型和層級記錄訊息,並在運行時控制這些訊息的格式以及報告的位置。

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 知識點

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.