簡體   English   中英

Log4j、commons-logging、JDK-Logging 和 SLF4J 是如何相互關聯的?

[英]How do Log4j, commons-logging, JDK-Logging and SLF4J relate to each other?

它們是替代品、依賴關系、API 還是彼此的實現? 它們為什么存在?

啊,Java 中的日志框架。 您的問題混合了 2 種不同類型的庫:

  • log4j 和 JDK 日志記錄是用於處理日志記錄的庫
  • Commons Logging 和 SLF4J 是日志門面:你仍然需要一個真正的日志實現(比如 log4j)

如果您正在編寫一個將在其他人的系統中使用的庫,那么您應該使用日志外觀,因為您不知道他們將使用哪個日志框架。 在這種情況下,請使用 SLF4J(Commons Logging 較舊並且存在一些類加載器問題)。

如果您控制整個應用程序並且可以指定使用哪個日志記錄框架,您可以自由選擇自己的偏好。 我的首選解決方案是(按優先順序):

  • 回溯
  • log4j
  • JDK 日志記錄(在我看來,SUN 的“不是在這里發明的”案例)

我最近也在研究這個。 多年來,我一直在使用 Log4J 和 Commons Logging,最近切換到 SLF4J。

Log4j

Log4j 是一個實際進行日志寫入/分發的框架。 它非常靈活:您可以指示它將日志消息發送到文件、系統日志、遠程監控等。您還可以配置多個記錄器、記錄類別、在條目中包含上下文等。 它是最流行的日志記錄系統之一。

JDK 日志記錄

JDK 1.4.2 中添加了內置的 JDK 日志記錄(老實說,我從未使用過)。 據我所知,它不是很受歡迎,因為它不如 Log4j 靈活,但我歡迎評論:)。

Commons 日志記錄SLF4j

這兩者都是各種日志框架之上的外觀,為您的應用程序提供了一個通用接口。 例如,您可以在應用程序中使用 CL/SLF4J,它們將自動檢測底層記錄器實現(Log4J、JDK 日志記錄或僅委托給System.err.println()的內置記錄器)。 好處是您或您的最終用戶可以決定隨意切換底層日志記錄實現,它們通過消除 Log4J 和 JDK 日志記錄的許多復雜性大大簡化了您的實現。

大多數情況下,您會看到它們分層。

SLF4J 純粹是一個抽象層,它本身並不用於實際的日志輸出,而是由您在代碼中用來記錄消息。

一個典型的設置是使用 SLF4J 登錄你的代碼,然后使用 log4j 作為底層的“輸出”層,使用適當的 slf4j->log4j 橋(一個 jar 你只包括在你的類路徑中)。 為了合並來自不同來源的日志記錄,存在各種橋梁。 例如,許多應用服務器(如 tomcat)將使用 JDK 日志記錄來避免在已部署的應用程序上強制使用“非標准”日志記錄框架。 為此,slf4j 有一個橋接器,它將從 JDK 日志記錄中獲取所有 output。 所以,這可能是一個堆棧

JDK-logging <- Your app-server or framworks might log using this
  |
(JDK->Slf4j bridge)
  |
Slf4j <- your application logs using Slf4j
  |
(Slf4j->log4j bridge)
  |
log4j <- log4j is just responsible for outputting to the appenders you configure (file, console etc)

SLF4J 只是具有不同后端(任何其他日志記錄系統)的通用 API。 Log4j 和 commons-logging (CL) 不同的測井庫,CL 是化石。 但是它們都有一個致命的缺陷,所以 sun 發明了 JDK 日志記錄。

至於我,我更喜歡 SLF4J 作為最靈活的和logback作為它的后端。 Logback 是最現代的,並且有很多不錯的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM