7 月 至 SLF4J 橋
一、簡介
JUL 是Java 內建的日誌框架。它使用簡單,但缺乏現代替代品提供的靈活性和高級功能。出於這個原因,許多應用程式選擇了其他東西。
但在這個模組化軟體和第三方依賴項的世界中,儘管我們偏好,但我們應用程式中的某些內容可能會使用 JUL 。這使得正確配置日誌變得更加複雜。
在本文中,我們將了解 SLF4J 的 JUL 到 SLF4J 橋如何協助解決此問題。
2. 依賴關係
首先,我們將 SLF4J 依賴項包含在我們的專案中。對於 Maven 項目,我們需要將[slf4j-api](https://mvnrepository.com/artifact/org.slf4j/slf4j-api)
和[jul-to-slf4j](https://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j)
依賴項新增至pom.xml
檔:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>2.0.16</version>
</dependency>
jul-to-slf4j
工件由java.util.logging
(JUL) 處理程序組成,即SLF4JBridgeHandler
,它將所有傳入的 JUL 記錄路由到 SLF4J API。
請注意,應用程式還必須指定要使用的 SLF4J API SLF4J 日誌記錄實作。因此,對於本文,我們假設我們的應用程式使用slf4j-simple
:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
3. 預設 JUL 日誌
在配置橋接之前,如果程式庫透過 JUL 記錄,輸出將使用預設的 JUL 格式。例如,考慮以下程式碼:
import java.util.logging.Logger;
public class BusinessLogic {
static void julLog(Logger julLogger) {
julLogger.info("This is a JUL info log message!");
julLogger.warning("This is a JUL warning log message!");
}
}
當在沒有 JUL-to-SLF4J 橋的情況下執行此程式碼時, julLog()
會產生類似下列內容的輸出:
Jan 19, 2025 11:43:41 PM com.baeldung.BusinessLogic julLog INFO: This is a JUL info log message!
Jan 19, 2025 11:43:41 PM com.baeldung.BusinessLogic julLog WARNING: This is a JUL warning log message!
4. 設定網橋
我們可以透過以下兩種方式之一來配置橋:以程式設計方式或透過logging.properties
檔案。讓我們逐一看看。
4.1.程式化配置
我們可以在主應用程式類別中以程式設計方式設定 SLF4J 橋。此方法很簡單,並確保在應用程式的初始化階段安裝橋接器:
import org.slf4j.bridge.SLF4JBridgeHandler;
import java.util.logging.Logger;
public static void main(String[] args) {
// Remove existing handlers
SLF4JBridgeHandler.removeHandlersForRootLogger();
// Install SLF4J bridge
SLF4JBridgeHandler.install();
// Test output after slf4j bridge was installed
BusinessLogic.julLog(julLogger);
BusinessLogic.slf4jLog(logger);
}
在此程式碼中,我們首先刪除任何現有的 JUL 處理程序以防止重複的日誌條目。然後,我們安裝 SLF4J 橋,它將所有 JUL 日誌記錄重新導向到 SLF4J。
4.2.使用logging.properties
進行配置
或者,我們可以使用 JUL 的logging.properties
檔案以宣告方式配置橋。此方法非常適合無法修改程式碼庫或新增程式配置的應用程式。
為此,我們首先建立src/main/resources/logging.properties
並指定 JUL 處理程序和日誌記錄等級:
handlers = org.slf4j.bridge.SLF4JBridgeHandler
.level = INFO
在此配置中:
-
handlers
行指定SLF4JBridgeHandler
應處理 JUL 根記錄器的日誌記錄 - 這 。
level
屬性將預設日誌記錄等級設為INFO
,這表示僅記錄此等級或更高等級的消息
JUL預設使用JAVA_HOME/conf
目錄中的logging.properties
檔案。為了確保使用我們的自訂配置,我們需要在執行應用程式時明確指定logging.properties
檔案的位置。這可以使用 JVM 參數來完成:
-Djava.util.logging.config.file=/path/to/logging.properties
這可確保載入我們的自訂日誌記錄配置而不是預設配置。
請注意,這種方法工作正常,但它有一個缺點,即我們需要管理一些 JUL 內部元件才能使其工作。程式設計方法使我們能夠堅持使用 SLF4J API 進行配置。
5. 測試日誌配置
現在我們已經設定了 JUL 到 SLF4J 的橋接器,我們可以測試日誌配置以確保一切按預期工作。
5.1.透過 JUL 記錄
即使第三方函式庫使用 JUL 進行日誌記錄,日誌訊息現在也將透過 SLF4J 進行路由:
import java.util.logging.Logger;
public class BusinessLogic {
static void julLog(Logger julLogger) {
julLogger.info("This is a JUL info log message!");
julLogger.warning("This is a JUL warning log message!");
}
}
這些日誌將由 SLF4J 後端(例如slf4j-simple
)處理,而不是 JUL,並且julLog()
輸出類似於:
[main] INFO com.baeldung.JULAppWithProgrammaticSLF4J - This is a JUL info log message!
[main] WARN com.baeldung.JULAppWithProgrammaticSLF4J - This is a JUL warning log message!
5.2.直接透過 SLF4J 記錄
雖然上一節表明我們現在可以將 JUL 與 SLF4J 一起使用,但最好聲明一個 SLF4J 記錄器:
public class BusinessLogic {
static void slf4jLog(org.slf4j.Logger logger) {
logger.info("This is an SLF4J info log message!");
logger.error("This is an SLF4J error log message!");
}
}
透過測試基於 JUL 和基於 SLF4J 的日誌記錄,我們可以確認整合正常運作。
六、結論
JUL 到 SLF4J 橋接器增強了我們的日誌記錄功能,同時保持與 JUL 的兼容性。透過整合 SLF4J,我們獲得了強大的日誌記錄 API 並提高了靈活性。對於旨在改進日誌記錄實踐並確保可維護性的開發人員來說,該橋樑是一個有價值的補充。像往常一樣,可以在 GitHub 上找到程式碼。