簡體   English   中英

讓 SLF4J 運行而無需將任何內容處理到 WebLogic 庫目錄中

[英]Get SLF4J running without coping anything into WebLogic lib-directory

我需要讓 SLF4J 在 WebLogic 應用程序中工作。 根據 Buttso [1] 和 Oracle [2],需要將文件復制到domain/lib目錄:

  • slf4j-api
  • slf4j-jdk14-1.6.0.jar

然后在logging.property文件中定義以下處理程序:

 handlers = weblogic.logging.ServerLoggingHandler

並使用附加的以下參數啟動 WebLogic。

-Djava.util.logging.config.file=C:\tmp\logging.properties

我理解為什么必須全局定義屬性文件。 但我不明白,為什么 JARs 必須復制到 WebLogic 的domain/lib目錄中。 我試圖將它們留在我的 WAR 文件中,但它不起作用。

有沒有辦法將日志庫保留在應用程序的控制之下? 這個限制是從哪里來的? 可以直接從應用程序中使用 Weblogic 的 JDK14 日志記錄基礎結構:

java.util.logging.Logger LOGGER = java.util.logging.Logger.getLogger("my.logger.Name");
LOGGER.info("JDK14 Anonymous info");

它按預期工作。 處理程序weblogic.logging.ServerLoggingHandler能夠成功攔截消息並將其轉發到 WSL 日志文件中。 為什么 SLF4J 橋不能做同樣的事情?


[1] 將 SLF4J 與 WebLogic Server 日志記錄一起使用http://buttso.blogspot.com/2011/06/using-slf4j-with-weblogic-server.html

[2] 如何將 SLF4J 重定向到 WebLogic 日志系統? https://support.oracle.com/epmos/faces/DocumentDisplay?id=1507456.1 (需要 Oracle 訂閱)

拍攝說明:

它與應用程序打包的 SLF4J 完美配合。 重要的是 API slf4j-api和實現slf4j-jdk14必須由同一個類加載器加載。

詳細描述:

默認情況下,Weblogic 類加載器具有優先級。 如果兩個庫( slf4j-apislf4j-jdk14 )都位於domain/lib目錄中,則 go 不會出錯。

如果slf4j-api位於應用程序類路徑中但不在 Weblogic 類路徑中,則可能發生兩種情況:

  • SLF4J 發現與應用程序一起打包的一些錯誤實現。 例如,它可能是作為某些第三方庫的強制依賴項的 logback。 在這種情況下,消息將被轉發到錯誤的實現中,並且它們不會到達 WebLogic 日志基礎架構。

  • SLF4J 在 WebLogic 類路徑中找到了一些實現。 在這種情況下,應用程序很可能會因為ClassCastException而無法部署。

正如我所說,可以在應用程序中包含所有 SLF4J 日志庫。 例如,如果 WebLogic 服務器是共享實例並且不受您的控制,則需要它。 需要做兩件事:

  • 確保只有一個 SLF4J 實現與應用程序打包在一起。 在我們的例子中,它是slf4j-jdk14 確保maven clean ,從 WAR 文件中刪除之前嘗試的所有剩余物!

  • 強制使用應用程序類加載器來加載 SLF4J 庫。 它由WEB-INF/weblogic.xml完成,如下所示:

     <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.9/weblogic-web-app.xsd"> <wls:weblogic-version>14.1.1.0</wls:weblogic-version> <wls:context-root>test-oauth</wls:context-root> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.slf4j.*</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>

這是一個有用的示例,如何找出哪個類加載器負責給定的 class 或實例。

哪個類加載器加載了所提供實例的 class

暫無
暫無

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

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