Log4j 和 Java 中的 log4j.properties 檔案指南
一、簡介
Log4J 是一個用 Java 寫的流行的開源日誌框架。各種基於Java的應用程式廣泛使用Log4j。此外,它是線程安全的、快速的,並提供命名的Logger
層次結構。 Log4j 根據開源 Apache 軟體授權分發。
Log4j 1.x 於 2015 年 8 月 5 日結束生命。因此,截至今天,Log4j2 是 Log4j 的最新升級。
在本教學中,我們將了解 Log4j 以及如何使用 Java 中的log4j.properties
檔案來配置核心 Log4j 元件。
2.Maven設定
我們需要pom.xml
中的log4j-core
依賴項來開始:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>1.2.17</version>
</dependency>
最新版本的log4j-core
可以在這裡找到。
3.Log4j API
Log4j API 提供了根據不同優先順序傳遞日誌資訊並將其定向到不同目的地(例如檔案、控制台、資料庫等)的機制。它還支援在將日誌事件傳遞給logger
或appender
之前對其進行過濾。
Log4j API 具有分層架構,在 Log4j 框架中提供兩種類型的物件:核心物件和支援物件。
4.Log4j組件
Log4j 包含三個主要元件—— logger
器、 appender
和layout
——可以一起使用它們在所需的目的地列印自訂的日誌語句。讓我們簡單地看一下它們。
4.1. Logger
Logger
物件負責表示日誌資訊。它是 Log4j 架構中的第一個強制層。 Logger
類別在套件org.apache.log4j
中定義。
通常,我們會為每個應用程式類別建立一個Logger
實例來記錄屬於該類別的重要事件。此外,我們通常使用接受類別名稱作為參數的靜態工廠方法在類別的開頭建立此實例:
private static final Logger logger = Logger.getLogger(JavaClass.class.getName());
隨後,我們可以使用Logger
類別的各種方法根據重要事件的類別來記錄或列印重要事件。這些方法分別是trace()
、 debug()
、 info()
、 warn()
、 error()
、 fatal()
。這些方法決定日誌記錄請求的等級。
Logger
方法的優先順序為: TRACE
< DEBUG
< INFO
< WARN
< ERROR
< FATAL
。因此,這些方法根據log4j.properties
檔案中設定的logger
等級列印日誌訊息。這意味著如果我們將logger
等級設為INFO
,那麼所有INFO
、 WARN
、 ERROR
和FATAL
事件都會被記錄。
4.2. Appender
Appender
表示日誌輸出的目的地。我們可以使用 Log4j 將日誌列印到多個首選目的地,例如控制台、檔案、遠端套接字伺服器、資料庫等。我們將這些輸出目的地稱為Appender
。此外,我們可以將多個appender
附加到一個Logger
上。
Appender
的工作是根據appender
可加性規則進行。此規則規定任何Logger
的日誌語句的輸出都會傳送到其所有appender
及其祖先-**層次結構中較高的appender
** 。
Log4j 為檔案、控制台、GUI 元件、遠端套接字伺服器、JMS 等定義了多個appender
。
4.3. Layout
我們使用layout
來自訂日誌語句的格式。我們可以透過將layout
與已定義的appender
相關聯來做到這一點。因此, layout
和appender
的組合可以幫助我們將格式化的日誌語句傳送到所需的目的地。
我們可以使用轉換模式指定日誌語句的格式。 PatternLayout
類別解釋了更多關於我們可以根據需要使用的轉換字元的資訊。
我們還將透過以下部分中的範例了解一些轉換字元。
log4j.properties
文件
我們可以使用 XML 或屬性檔來配置 Log4j。 log4j.properties
檔案將配置儲存在鍵值對中。
log4j 屬性設定檔的預設名稱是log4j.properties
。 Logger
在CLASSPATH
中尋找該檔名。但是,如果我們需要使用不同的設定檔名,我們可以使用系統屬性log4j.configuration
進行設定。
log4j.properties
檔案包含appender
的規格、它們的名稱和類型以及layout
模式。它還包含有關預設root Logger
及其日誌等級的規範。
6. log4j.properties
檔案的語法
在通用的log4j.properties
檔案中,我們定義以下配置:
-
root logger
及其等級。我們還在這裡為appender
提供了一個名稱。 - 然後,我們將有效的
appender
指派給定義的附加程式名稱。 - 最後,我們為定義的
appender
定義layout
、目標、等級等。
讓我們來看看一般 log4.properties 檔案的語法:
# The root logger with appender name
log4j.rootLogger = DEBUG, NAME
# Assign NAME a valid appender
log4j.appender.NAME = org.apache.log4j.FileAppender
# Define the layout for NAME
log4j.appender.NAME.layout=org.apache.log4j.PatternLayout
log4j.appender.NAME.layout.conversionPattern=%m%n
這裡, NAME
是Appender
的名稱。如同前面所討論的,我們可以將多個appender
附加到一個Logger
上,以將日誌定向到不同的目的地。
7. 例子
現在,讓我們透過一些範例來了解不同appender
的log4j.properties
檔案配置。
7.1.範例程式
讓我們從記錄一些訊息的範例應用程式開始:
import org.apache.log4j.Logger;
public class Log4jExample {
private static Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) throws InterruptedException {
for(int i = 1; i <= 2000; i++) {
logger.info("This is the " + i + " time I say 'Hello World'.");
Thread.sleep(100);
}
}
}
該應用程式很簡單 - 它在循環中寫入一些訊息,迭代之間有短暫的延遲。它有 2,000 次迭代,每次迭代有 100 毫秒的暫停。因此,大約需要三分半鐘才能完成執行。我們將在下面的範例中使用此應用程式。
7.2.控制台日誌記錄
如果未找到設定文件,則控制台是記錄訊息的預設位置。讓我們使用root logger
為ConsoleAppender
建立一個log4j.properties
配置,並為其定義日誌記錄等級:
# Root Logger
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
在這裡,我們定義了一個具有以下規範的log4j.properties
檔案:
- 我們將
root logger
的等級定義為INFO
。這意味著所有等級為INFO
及以上的日誌事件都將被記錄。我們也將appender
的名稱定義為stdout
。 - 由於我們希望將日誌導向至控制台,因此我們將
Appender
指定為org.apache.log4j.ConsoleAppender
,將目標指定為System.out
。 - 最後,我們指定了
PatternLayout
的格式,我們希望在其中使用ConversionPattern
列印日誌。
我們還需要了解我們使用的ConversionPattern
中每個轉換字元的含義:
-
%d
以定義的格式新增時間戳記。 -
%-5p
將日誌等級資訊加入到每個日誌語句中。它表示日誌記錄事件的優先權應保持五個字元的寬度對齊。 -
%c{1}
列印限定的類別名,可選地後面跟著包名(精度限定符),
即記錄特定的日誌語句。 -
%L
列印特定日誌事件的行號。 -
%m
列印實際的日誌訊息。 -
%n
在每個日誌語句後面都會新增一行。
因此,當我們運行範例應用程式時,我們會在控制台上列印以下幾行:
2023-08-01 00:27:25 INFO Log4jExample:15 - This is the 1 time I say 'Hello World'.
...
...
2023-08-01 00:27:25 INFO Log4jExample:15 - This is the 2000 time I say 'Hello World'.
PatternLayout
類別的文檔詳細解釋了我們可以根據需要使用的轉換字元。
7.3.多個目的地
如前所述,我們可以將日誌事件重新導向到多個目的地:
# Root logger
log4j.rootLogger=INFO, file, stdout
# Direct to a file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\Baeldung\\app.log
log4j.appender.file.MaxFileSize=5KB
log4j.appender.file.MaxBackupIndex=2
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Direct to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
在這裡,我們使用了兩個appender
將日誌訊息重新導向到檔案和控制台。此外,我們也為我們的檔案Appender
指派了一個RollingFileAppender
。當我們知道日誌檔案的大小可能會隨著時間的推移而成長時,我們會使用RollingFileAppender
。
在上面的範例中,我們使用了RollingFileAppender,
它使用MaxFileSize
和MaxBackupIndex
參數根據日誌檔案的大小和計數來滾動日誌檔案。因此,當日誌檔案大小達到 5KB 時,日誌檔案將進行滾動,並且我們最多保留兩個滾動日誌檔案作為備份。
當我們運行範例應用程式時,我們獲得以下文件,其中包含與上一個範例中相同的日誌語句:
31/01/2023 10:28 138 app.log 31/01/2023 10:28 5.281 app.log.1 31/01/2023 10:28 5.281 app.log.2
我們可以在基於大小滾動日誌檔案的範例中找到執行的詳細說明。
八、結論
在本文中,我們探討了 Log4j 及其三個元件 – logger
、 appender
和layout
。我們也了解了log4j.properties
檔案的語法以及配置log4j.properties
檔案的一些簡單範例。
與往常一樣,本文附帶的範例可以在 GitHub 上找到。