log4j 快速指南



log4j - 概述

log4j 是一個可靠、快速且靈活的基於 Java 的日誌框架(API),根據 Apache 軟體許可證釋出。

log4j 已移植到 C、C++、C#、Perl、Python、Ruby 和 Eiffel 等語言。

log4j 可以透過外部配置檔案在執行時進行高度配置。它將日誌記錄過程視為優先順序級別,並提供機制將日誌資訊定向到各種目的地,例如資料庫、檔案、控制檯、UNIX Syslog 等。

log4j 有三個主要元件

  • 記錄器 (loggers):負責捕獲日誌資訊。

  • 追加器 (appenders):負責將日誌資訊釋出到各種首選目的地。

  • 佈局 (layouts):負責以不同的樣式格式化日誌資訊。

log4j 的歷史

  • 始於 1996 年初,作為歐盟 SEMPER(歐洲安全電子市場)專案的跟蹤 API。

  • 經過無數次增強和多次迭代,最初的 API 已發展成為 log4j,一個流行的 Java 日誌包。

  • 該軟體包根據 Apache 軟體許可證釋出,這是一個由開源計劃認證的成熟開源許可證。

  • 最新的 log4j 版本,包括其完整原始碼、類檔案和文件,可以在 http://logging.apache.org/log4j/ 找到。

log4j 特性

  • 它是執行緒安全的。

  • 它針對速度進行了最佳化。

  • 它基於命名記錄器層次結構。

  • 它支援每個記錄器使用多個輸出追加器。

  • 它支援國際化。

  • 它不受限於預定義的設施集。

  • 可以使用配置檔案在執行時設定日誌記錄行為。

  • 它從一開始就被設計用於處理 Java 異常。

  • 它使用多個級別,即 ALL、TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL。

  • 可以透過擴充套件 Layout 類輕鬆更改日誌輸出的格式。

  • 日誌輸出的目標以及寫入策略可以透過 Appender 介面的實現來更改。

  • 它是故障停止的。但是,儘管它當然努力確保交付,但 log4j 並不保證每個日誌語句都會交付到其目的地。

日誌記錄的優缺點

日誌記錄是軟體開發的重要組成部分。編寫良好的日誌程式碼可以提供快速除錯、輕鬆維護以及應用程式執行時資訊的結構化儲存。

日誌記錄也存在缺點。它可能會減慢應用程式的速度。如果過於冗長,可能會導致滾動盲視。為了緩解這些問題,log4j 被設計為可靠、快速且可擴充套件的。

由於日誌記錄很少是應用程式的主要焦點,因此 log4j API 努力做到簡單易懂和易於使用。

log4j - 安裝

log4j API 軟體包根據 Apache 軟體許可證釋出,這是一個由開源計劃認證的成熟開源許可證。

最新的 log4j 版本,包括完整原始碼、類檔案和文件,可以在 http://logging.apache.org/log4j/ 找到。

要在您的系統上安裝 log4j,請從指定的 URL 下載 apache-log4j-x.x.x.tar.gz 並按照以下步驟操作。

步驟 1

將下載的檔案解壓縮並解壓到 /usr/local/ 目錄中,如下所示

$ gunzip apache-log4j-1.2.15.tar.gz
$ tar -xvf apache-log4j-1.2.15.tar
apache-log4j-1.2.15/tests/input/
apache-log4j-1.2.15/tests/input/xml/
apache-log4j-1.2.15/tests/src/
apache-log4j-1.2.15/tests/src/java/
apache-log4j-1.2.15/tests/src/java/org/
.......................................

解壓時,它將建立如下名為 apache-log4j-x.x.x 的目錄層次結構

-rw-r--r--  1 root root   3565 2007-08-25 00:09 BUILD-INFO.txt
-rw-r--r--  1 root root   2607 2007-08-25 00:09 build.properties.sample
-rw-r--r--  1 root root  32619 2007-08-25 00:09 build.xml
drwxr-xr-x 14 root root   4096 2010-02-04 14:09 contribs
drwxr-xr-x  5 root root   4096 2010-02-04 14:09 examples
-rw-r--r--  1 root root   2752 2007-08-25 00:09 INSTALL
-rw-r--r--  1 root root   4787 2007-08-25 00:09 KEYS
-rw-r--r--  1 root root  11366 2007-08-25 00:09 LICENSE
-rw-r--r--  1 root root 391834 2007-08-25 00:29 log4j-1.2.15.jar
-rw-r--r--  1 root root    160 2007-08-25 00:09 NOTICE
-rwxr-xr-x  1 root root  10240 2007-08-25 00:27 NTEventLogAppender.dll
-rw-r--r--  1 root root  17780 2007-08-25 00:09 pom.xml
drwxr-xr-x  7 root root   4096 2007-08-25 00:13 site
drwxr-xr-x  8 root root   4096 2010-02-04 14:08 src
drwxr-xr-x  6 root root   4096 2010-02-04 14:09 tests

步驟 2

此步驟是可選的,取決於您將要從 log4j 框架中使用哪些功能。如果您的機器上已安裝以下軟體包,則可以正常使用,否則您需要安裝它們才能使 log4j 工作。

步驟 3

現在您需要適當地設定 CLASSPATHPATH 變數。在這裡,我們將僅為 log4j.x.x.x.jar 檔案設定它。

$ pwd
/usr/local/apache-log4j-1.2.15
$ export CLASSPATH= \
      $CLASSPATH:/usr/local/apache-log4j-1.2.15/log4j-1.2.15.jar
$ export PATH=$PATH:/usr/local/apache-log4j-1.2.15/

log4j - 架構

log4j API 遵循分層架構,其中每一層提供不同的物件來執行不同的任務。這種分層架構使設計靈活且易於將來擴充套件。

log4j 框架中有兩種型別的物件可用。

  • 核心物件:這些是框架的必備物件。它們是使用框架所必需的。

  • 支援物件:這些是框架的可選物件。它們支援核心物件執行其他但重要的任務。

核心物件

核心物件包括以下型別的物件

記錄器物件

頂層是記錄器,它提供記錄器物件。記錄器物件負責捕獲日誌資訊,並將它們儲存在名稱空間層次結構中。

佈局物件

佈局層提供用於以不同樣式格式化日誌資訊的佈局物件。它在釋出日誌資訊之前為追加器物件提供支援。

佈局物件在以人類可讀且可重用的方式釋出日誌資訊方面發揮著重要作用。

追加器物件

這是一個較低級別的層,它提供追加器物件。追加器物件負責將日誌資訊釋出到各種首選目的地,例如資料庫、檔案、控制檯、UNIX Syslog 等。

以下虛擬圖顯示了 log4J 框架的元件

log4j Architecture

支援物件

log4j 框架中還有其他重要的物件在日誌框架中發揮著至關重要的作用

級別物件

級別物件定義任何日誌資訊的粒度和優先順序。API 中定義了七個日誌級別:OFF、DEBUG、INFO、ERROR、WARN、FATAL 和 ALL。

過濾器物件

過濾器物件用於分析日誌資訊並進一步決定是否應記錄該資訊。

追加器物件可以有多個過濾器物件與其關聯。如果將日誌資訊傳遞到特定的追加器物件,則與該追加器關聯的所有過濾器物件都需要批准該日誌資訊,然後才能將其釋出到附加的目的地。

物件渲染器

物件渲染器物件專門用於提供傳遞到日誌框架的不同物件的字串表示形式。佈局物件使用此物件來準備最終的日誌資訊。

日誌管理器

日誌管理器物件管理日誌框架。它負責從系統範圍的配置檔案或配置類中讀取初始配置引數。

log4j - 配置

上一章解釋了 log4j 的核心元件。本章說明如何使用配置檔案配置核心元件。配置 log4j 包括在配置檔案中分配級別、定義追加器和指定佈局物件。

log4j.properties 檔案是 log4j 配置檔案,它以鍵值對的形式儲存屬性。預設情況下,LogManager 在 CLASSPATH 中查詢名為 log4j.properties 的檔案。

  • 根記錄器的級別定義為 DEBUG。DEBUG 將名為 X 的追加器附加到它。

  • 將名為 X 的追加器設定為有效的追加器。

  • 為追加器 X 設定佈局。

log4j.properties 語法

以下是追加器 X 的 log4j.properties 檔案的語法

# Define the root logger with appender X
log4j.rootLogger = DEBUG, X

# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender

# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n

log4j.properties 示例

使用上述語法,我們在 log4j.properties 檔案中定義以下內容

  • 根記錄器的級別定義為 DEBUG,將名為 FILE 的追加器附加到它。

  • 追加器 FILE 定義為 org.apache.log4j.FileAppender。它寫入位於 log 目錄中的名為“log.out”的檔案。

  • 定義的佈局模式為 %m%n,這意味著列印的日誌訊息後面將跟一個換行符。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

需要注意的是,log4j 支援 UNIX 風格的變數替換,例如 ${variableName}。

除錯級別

我們對兩個追加器都使用了 DEBUG。所有可能的選項是

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
  • ALL

這些級別將在 log4j 日誌級別 中解釋。

追加器

Apache log4j 提供追加器物件,這些物件主要負責將日誌訊息列印到不同的目的地,例如控制檯、檔案、套接字、NT 事件日誌等。

每個追加器物件都與其關聯的不同屬性,這些屬性指示該物件的行為。

屬性 描述
layout 追加器使用佈局物件及其關聯的轉換模式來格式化日誌資訊。
target 目標可以是控制檯、檔案或其他專案,具體取決於追加器。
level 級別是控制日誌訊息過濾所必需的。
threshold 追加器可以具有與其關聯的閾值級別,獨立於記錄器級別。追加器會忽略任何級別低於閾值級別的日誌訊息。
filter 過濾器物件可以分析超出級別匹配的日誌資訊,並決定特定追加器是否應處理日誌請求或將其忽略。

我們可以透過在配置檔案中包含以下設定,並使用以下方法將追加器物件新增到記錄器

log4j.logger.[logger-name]=level, appender1,appender..n

您可以使用以下 XML 格式編寫相同的配置

<logger name="com.apress.logging.log4j" additivity="false">
   <appender-ref ref="appender1"/>
   <appender-ref ref="appender2"/>
</logger>

如果您願意在程式中新增追加器物件,則可以使用以下方法

public void addAppender(Appender appender);

addAppender() 方法用於向 Logger 物件新增一個 Appender。如示例配置所示,可以在逗號分隔的列表中向一個日誌記錄器新增多個 Appender 物件,每個物件將日誌資訊列印到不同的目標。

在上面的示例中,我們只使用了一個 appender,即 FileAppender。所有可能的 appender 選項如下:

  • AppenderSkeleton
  • AsyncAppender
  • ConsoleAppender
  • DailyRollingFileAppender
  • ExternallyRolledFileAppender
  • FileAppender
  • JDBCAppender
  • JMSAppender
  • LF5Appender
  • NTEventLogAppender
  • NullAppender
  • RollingFileAppender
  • SMTPAppender
  • SocketAppender
  • SocketHubAppender
  • SyslogAppender
  • TelnetAppender
  • WriterAppender

我們將在 檔案中的日誌記錄 中介紹 FileAppender,並在 資料庫中的日誌記錄 中介紹 JDBC Appender。

佈局(Layout)

我們在 appender 中使用了 PatternLayout。所有可能的選項如下:

  • DateLayout
  • HTMLLayout
  • PatternLayout
  • SimpleLayout
  • XMLLayout

使用 HTMLLayout 和 XMLLayout,您還可以生成 HTML 和 XML 格式的日誌。

佈局格式化

您將在以下章節中學習如何格式化日誌訊息:日誌格式化

log4j - 示例程式

我們已經瞭解瞭如何建立配置檔案。本章將介紹如何生成除錯訊息並將其記錄到一個簡單的文字檔案中。

以下是為我們的示例建立的簡單配置檔案。讓我們再次回顧一下它。

  • 根日誌記錄器的級別定義為 DEBUG,並將其附加到名為 FILE 的 appender。

  • Appender FILE 定義為 org.apache.log4j.FileAppender,並將日誌寫入位於 log 目錄中的名為“log.out”的檔案。

  • 定義的佈局模式為 %m%n,這意味著列印的日誌訊息後面將跟一個換行符。

log4j.properties 檔案的內容如下:

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

在 Java 程式中使用 log4j

以下 Java 類是一個非常簡單的示例,它初始化並使用 Log4J 日誌記錄庫用於 Java 應用程式。

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Hello this is a debug message");
      log.info("Hello this is an info message");
   }
}

編譯和執行

以下是編譯和執行上述程式的步驟。在進行編譯和執行之前,請確保已正確設定了 PATHCLASSPATH

所有庫都應該在 CLASSPATH 中可用,並且您的 log4j.properties 檔案應該在 PATH 中可用。請按照以下步驟操作:

  • 建立如上所示的 log4j.properties 檔案。

  • 建立如上所示的 log4jExample.java 檔案並編譯它。

  • 執行 log4jExample 二進位制檔案以執行程式。

您將在 /usr/home/log4j/log.out 檔案中獲得以下結果:

Hello this is a debug message
Hello this is an info message

log4j - 日誌記錄方法

Logger 類提供了各種方法來處理日誌記錄活動。Logger 類不允許我們例項化新的 Logger 例項,但它提供了兩種靜態方法來獲取 Logger 物件:

  • public static Logger getRootLogger();
  • public static Logger getLogger(String name);

這兩種方法中的第一種返回應用程式例項的根日誌記錄器,它沒有名稱。

任何其他命名的 Logger 物件例項都是透過第二種方法透過傳遞日誌記錄器的名稱來獲得的。日誌記錄器的名稱可以是您傳遞的任何字串,通常是類名或包名,就像我們在上一章中使用的那樣,並在下面提到。

static Logger log = Logger.getLogger(log4jExample.class.getName());

日誌記錄方法

一旦我們獲得了命名日誌記錄器的例項,我們就可以使用日誌記錄器的幾種方法來記錄訊息。Logger 類具有以下方法用於列印日誌資訊。

序號 方法及描述
1 public void debug(Object message)

它使用 Level.DEBUG 級別列印訊息。

2 public void error(Object message)

它使用 Level.ERROR 級別列印訊息。

3 public void fatal(Object message);

它使用 Level.FATAL 級別列印訊息。

4 public void info(Object message);

它使用 Level.INFO 級別列印訊息。

5 public void warn(Object message);

它使用 Level.WARN 級別列印訊息。

6 public void trace(Object message);

它使用 Level.TRACE 級別列印訊息。

所有級別都在 org.apache.log4j.Level 類中定義,並且可以按如下方式呼叫上述任何方法:

import org.apache.log4j.Logger;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

當您編譯並執行 LogClass 程式時,它將生成以下結果:

Debug Message!
Info Message!
Warn Message!
Error Message!
Fatal Message!

當與級別結合使用時,所有除錯訊息都更有意義。我們將在下一章中介紹級別,然後您將很好地理解如何將這些方法與不同的除錯級別結合使用。

log4j - 日誌級別

org.apache.log4j.Level 類提供以下級別。您還可以透過對 Level 類進行子類化來定義自定義級別。

級別 描述
ALL 所有級別,包括自定義級別。
DEBUG 指定細粒度的資訊事件,這些事件對於除錯應用程式最有用。
INFO 指定突出顯示應用程式在粗粒度級別上的進展情況的資訊訊息。
WARN 指定潛在的有害情況。
ERROR 指定可能仍然允許應用程式繼續執行的錯誤事件。
FATAL 指定非常嚴重的錯誤事件,這些事件可能會導致應用程式中止。
OFF 最高可能的級別,旨在關閉日誌記錄。
TRACE 指定比 DEBUG 更細粒度的資訊事件。

級別如何工作?

如果 p >= q,則日誌記錄器級別為 q 的級別為 p 的日誌請求將被啟用。此規則是 log4j 的核心。它假設級別是有序的。對於標準級別,我們有 ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。

以下示例顯示了我們如何過濾所有 DEBUG 和 INFO 訊息。此程式使用 logger 方法 setLevel(Level.X) 來設定所需的日誌記錄級別。

此示例將列印除 Debug 和 Info 之外的所有訊息。

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   
   public static void main(String[] args) {
      log.setLevel(Level.WARN);

      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

當您編譯並執行 LogClass 程式時,它將生成以下結果:

Warn Message!
Error Message!
Fatal Message!

使用配置檔案設定級別

log4j 提供了基於配置檔案的級別設定,當您想要更改除錯級別時,它使您無需更改原始碼。

以下是一個示例配置檔案,它將執行與我們在上述示例中使用 log.setLevel(Level.WARN) 方法相同的任務。

# Define the root logger with appender file
log = /usr/home/log4j
log4j.rootLogger = WARN, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

現在讓我們使用以下程式:

import org.apache.log4j.*;

public class LogClass {
   private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
   public static void main(String[] args) {
      log.trace("Trace Message!");
      log.debug("Debug Message!");
      log.info("Info Message!");
      log.warn("Warn Message!");
      log.error("Error Message!");
      log.fatal("Fatal Message!");
   }
}

現在編譯並執行上述程式,您將在 /usr/home/log4j/log.out 檔案中獲得以下結果:

Warn Message!
Error Message!
Fatal Message!

log4j - 日誌格式

Apache log4j 提供了各種 Layout 物件,每個物件都可以根據各種佈局格式化日誌記錄資料。還可以建立以應用程式特定方式格式化日誌記錄資料的 Layout 物件。

所有 Layout 物件都從 Appender 物件接收 LoggingEvent 物件。然後,Layout 物件從 LoggingEvent 中檢索訊息引數,並應用相應的 ObjectRenderer 以獲取訊息的字串表示形式。

佈局型別

層次結構中的頂級類是抽象類 org.apache.log4j.Layout。這是 log4j API 中所有其他 Layout 類的基類。

Layout 類在應用程式中被定義為抽象,我們永遠不會直接使用此類;相反,我們使用它的子類,如下所示:

佈局方法

此類提供了所有其他 Layout 物件中所有常見操作的骨架實現,並聲明瞭兩個抽象方法。

序號 方法及描述
1 public abstract boolean ignoresThrowable()

它指示日誌資訊是否處理作為日誌事件一部分傳遞給它的任何 java.lang.Throwable 物件。如果 Layout 物件處理 Throwable 物件,則 Layout 物件不會忽略它,並返回 false。

2 public abstract String format(LoggingEvent event)

各個佈局子類實現此方法以進行特定於佈局的格式化。

除了這些抽象方法之外,Layout 類還為以下列出的方法提供了具體實現:

序號 方法及描述
1 public String getContentType()

它返回 Layout 物件使用的內容型別。基類返回 text/plain 作為預設內容型別。

2 public String getFooter()

它指定日誌訊息的頁尾資訊。

3 public String getHeader()

它指定日誌訊息的頁首資訊。

每個子類都可以透過覆蓋這些方法的具體實現來返回特定於類的資訊。

log4j - 檔案日誌記錄

要將日誌資訊寫入檔案,您必須使用 org.apache.log4j.FileAppender

FileAppender 配置

FileAppender 具有以下可配置引數:

屬性 描述
immediateFlush 此標誌預設設定為 true,這意味著輸出流到檔案在每次追加操作時都會被重新整理。
encoding 可以使用任何字元編碼。預設情況下,它是特定於平臺的編碼方案。
threshold 此 appender 的閾值級別。
Filename 日誌檔案的名稱。
fileAppend 此標誌預設設定為 true,這意味著日誌資訊將追加到同一檔案的末尾。
bufferedIO 此標誌指示是否需要啟用緩衝寫入。預設情況下,它設定為 false。
bufferSize 如果啟用了緩衝 I/O,則指示緩衝區大小。預設情況下,它設定為 8kb。

以下是 FileAppender 的示例配置檔案 log4j.properties

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, overwrite
log4j.appender.FILE.Append=false

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

如果您希望擁有等效於上述 log4j.properties 檔案的 XML 配置檔案,則以下是其內容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="FILE" class="org.apache.log4j.FileAppender">
   <param name="file" value="${log}/log.out"/>
   <param name="immediateFlush" value="true"/>
   <param name="threshold" value="debug"/>
   <param name="append" value="false"/>
   <layout class="org.apache.log4j.PatternLayout">
      <param name="conversionPattern" value="%m%n"/>
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="FILE"/>
</logger>

</log4j:configuration>

您可以嘗試使用上述配置使用 log4j - Sample Program

在多個檔案中記錄日誌

您可能希望出於某些原因將日誌訊息寫入多個檔案,例如,如果檔案大小達到某個閾值。

要將日誌資訊寫入多個檔案,您必須使用 org.apache.log4j.RollingFileAppender 類,該類擴充套件了 FileAppender 類並繼承了其所有屬性。

除了上面為 FileAppender 提到的屬性外,我們還有以下可配置引數:

屬性 描述
maxFileSize 這是檔案超過該大小將被滾動的臨界大小。預設值為 10 MB。
maxBackupIndex 此屬性表示要建立的備份檔案數量。預設值為 1。

以下是 RollingFileAppender 的示例配置檔案 log4j.properties

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.RollingFileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the maximum file size before rollover
log4j.appender.FILE.MaxFileSize=5MB

# Set the the backup index
log4j.appender.FILE.MaxBackupIndex=2

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

如果您希望擁有 XML 配置檔案,則可以生成與初始部分中提到的相同的 XML 配置檔案,並僅新增與 RollingFileAppender 相關的其他引數。

此示例配置演示了每個日誌檔案允許的最大大小為 5 MB。超過最大大小後,將建立一個新的日誌檔案。由於 maxBackupIndex 定義為 2,因此當第二個日誌檔案達到最大大小時,第一個日誌檔案將被擦除,此後,所有日誌資訊將回滾到第一個日誌檔案。

您可以嘗試使用上述配置使用 log4j - Sample Program

每日日誌檔案生成

可能需要每天生成日誌檔案以保留日誌資訊的乾淨記錄。

要將日誌資訊每天寫入檔案,您必須使用 org.apache.log4j.DailyRollingFileAppender 類,該類擴充套件了 FileAppender 類並繼承了其所有屬性。

除了上面為 FileAppender 提到的屬性外,還有一個重要的可配置引數:

屬性 描述
DatePattern 這指示何時滾動檔案以及要遵循的命名約定。預設情況下,每天午夜執行滾動。

DatePattern 使用以下模式之一控制滾動計劃:

DatePattern 描述
'.' yyyy-MM

每個月結束和下一個月開始時滾動。
'.' yyyy-MM-dd 每天午夜滾動。這是預設值。
'.' yyyy-MM-dd-a 每天中午和午夜滾動。
'.' yyyy-MM-dd-HH 每小時開始時滾動。
'.' yyyy-MM-dd-HH-mm 每分鐘滾動。
'.' yyyy-ww 根據區域設定,每週的第一天滾動。

以下是一個示例配置檔案log4j.properties,用於生成每天中午和午夜滾動的日誌檔案。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE

# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender

# Set the name of the file
log4j.appender.FILE.File=${log}/log.out

# Set the immediate flush to true (default)
log4j.appender.FILE.ImmediateFlush=true

# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug

# Set the append to false, should not overwrite
log4j.appender.FILE.Append=true

# Set the DatePattern
log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-a

# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n

如果您希望擁有一個XML配置檔案,您可以生成與初始部分中提到的相同的內容,並且僅新增與DailyRollingFileAppender相關的其他引數。

您可以嘗試使用上述配置使用 log4j - Sample Program

log4j - 資料庫日誌記錄

log4j API 提供了org.apache.log4j.jdbc.JDBCAppender物件,它可以將日誌資訊放入指定的資料庫中。

JDBCAppender 配置

屬性 描述
bufferSize 設定緩衝區大小。預設大小為1。
驅動程式 將驅動程式類設定為指定的字串。如果未指定驅動程式類,則預設為sun.jdbc.odbc.JdbcOdbcDriver。
layout 設定要使用的佈局。預設佈局為org.apache.log4j.PatternLayout。
密碼 設定資料庫密碼。
SQL 指定每次發生日誌事件時要執行的SQL語句。這可能是INSERT、UPDATE或DELETE。
URL 設定JDBC URL。
使用者 設定資料庫使用者名稱。

日誌表配置

在開始使用基於JDBC的日誌記錄之前,您應該建立一個表來維護所有日誌資訊。以下是建立LOGS表的SQL語句

CREATE TABLE LOGS
   (USER_ID VARCHAR(20) NOT NULL,
    DATED   DATE NOT NULL,
    LOGGER  VARCHAR(50) NOT NULL,
    LEVEL   VARCHAR(10) NOT NULL,
    MESSAGE VARCHAR(1000) NOT NULL
   );

示例配置檔案

以下是一個示例配置檔案log4j.properties,用於JDBCAppender,它將用於將訊息記錄到LOGS表中。

# Define the root logger with appender file
log4j.rootLogger = DEBUG, DB

# Define the DB appender
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender

# Set JDBC URL
log4j.appender.DB.URL=jdbc:mysql:///DBNAME

# Set Database Driver
log4j.appender.DB.driver=com.mysql.jdbc.Driver

# Set database user name and password
log4j.appender.DB.user=user_name
log4j.appender.DB.password=password

# Set the SQL statement to be executed.
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')

# Define the layout for file appender
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

對於MySQL資料庫,您必須使用實際的DBNAME、使用者ID和密碼,您在其中建立了LOGS表。SQL語句是執行一個帶有表名LOGS的INSERT語句,以及要輸入表中的值。

JDBCAppender不需要顯式定義佈局。相反,傳遞給它的SQL語句使用PatternLayout。

如果您希望擁有等效於上述 log4j.properties 檔案的 XML 配置檔案,則以下是其內容:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

<appender name="DB" class="org.apache.log4j.jdbc.JDBCAppender">
   <param name="url" value="jdbc:mysql:///DBNAME"/>
   <param name="driver" value="com.mysql.jdbc.Driver"/>
   <param name="user" value="user_id"/>
   <param name="password" value="password"/>
   <param name="sql" value="INSERT INTO LOGS VALUES('%x','%d','%C','%p','%m')"/>
   <layout class="org.apache.log4j.PatternLayout">
   </layout>
</appender>

<logger name="log4j.rootLogger" additivity="false">
   <level value="DEBUG"/>
   <appender-ref ref="DB"/>
</logger>

</log4j:configuration>

示例程式

以下Java類是一個非常簡單的示例,它初始化然後使用Log4J日誌記錄庫用於Java應用程式。

import org.apache.log4j.Logger;
import java.sql.*;
import java.io.*;
import java.util.*;

public class log4jExample{
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(log4jExample.class.getName());
   
   public static void main(String[] args)throws IOException,SQLException{
      log.debug("Debug");
      log.info("Info");
   }
}

編譯和執行

以下是編譯和執行上述程式的步驟。確保在繼續進行編譯和執行之前已正確設定了PATHCLASSPATH

所有庫都應該在CLASSPATH中可用,並且您的log4j.properties檔案應該在PATH中可用。按照給定的步驟操作

  • 建立如上所示的 log4j.properties 檔案。
  • 建立如上所示的 log4jExample.java 檔案並編譯它。
  • 執行 log4jExample 二進位制檔案以執行程式。

現在檢查DBNAME資料庫內的LOGS表,您會發現以下條目

mysql >  select * from LOGS;
+---------+------------+--------------+-------+---------+
| USER_ID | DATED      | LOGGER       | LEVEL | MESSAGE |
+---------+------------+--------------+-------+---------+
|         | 2010-05-13 | log4jExample | DEBUG | Debug   |
|         | 2010-05-13 | log4jExample | INFO  | Info    |
+---------+------------+--------------+-------+---------+
2 rows in set (0.00 sec)

注意:這裡x用於輸出與生成日誌事件的執行緒關聯的巢狀診斷上下文(NDC)。我們使用NDC來區分處理多個客戶端的伺服器端元件中的客戶端。有關此方面的更多資訊,請檢視Log4J手冊。

廣告