簡體   English   中英

LOG4J作為單例,無論如何要避免web環境中的log4j日志沖突

[英]LOG4J as a singleton, anyway to avoid log4j logging conflicts in web environment

我們有一個j2ee網絡環境。 服務器配置為跨多個webapp共享會話和可能的類加載器。 基本上,一個類加載器可以服務多個Web應用程序。

這似乎導致log4j的問題。 不同的webapps可能有不同的log4j配置,但日志記錄將移動到同一個文件。

在線閱讀,看起來log4j在appender和其他功能方面使用了很多單例。

有沒有辦法將log4j配置從一個webapp與另一個完全分開。

服務器:websphere6 +
Log4j:1.4.2
Java:1.5

Example log4j.properties (webapp1):

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=/usr/local/file1.log
log4j.additivity.com.app=false

Example log4j.properties (webapp2):

log4j.appender.Z=org.apache.log4j.RollingFileAppender
log4j.appender.Z.File=/usr/local/file2.log
log4j.additivity.com.app=false

現在,從webapp2登錄可能會出現在webapp1日志中,反之亦然。 我們不希望這樣。

可能解決方案

  • 有可能添加自定義文件appender? 這會解決問題,我會將哪些代碼添加到自定義appender中?

  • 是否可以更改log4j初始化。 例如,我可以使用一些啟動servlet為每個webapp加載logj4。

您有兩種方法可以解決您的問題:

  1. 配置您的應用。 服務器,因此它不會跨多個webapps共享類加載器。 當它這樣做時,由於log4j的性質,只會加載一個log4j.properties文件。

  2. 如果你離開應用程序。 服務器所以它共享類加載器,然后使用一個“主”log4j.properties文件。 在其中,為每個應用程序的root定義appender(例如com.mycompany.webapp1com.mycompany.webapp2

沒有解決方案是完美的 特別是,如果您的Web應用程序共享一些使用log4j的類,則第二個問題將會出現問題。 在這種情況下,來自兩個應用程序的日志將最終出現在同一個文件中。

你的問題很常見。 要了解有關此主題的更多信息,請訪問“log4j和j2ee”。

編輯:由於解決方案1和2不可行,您可以嘗試其他方法:

  • 每個應用程序使用log4j.properties文件。 在其中的每一個中,為其根定義一個appender(如解決方案2中所述),並將additivity設置為false。 如果它們之間有任何類共享,這也不是完美的。

  • 以編程方式為每個應用程序配置log4j。 由於它們是遺留應用程序,因此可能很難。 一種方法是為每個應用程序使用ServletContextListener ,並在應用程序啟動時配置log4j。 我沒有親自試過這個,所以我不能100%確定是否會因共享的類加載器而發生沖突。

Log4j將不再真正更新。 創建log4j的CekiGülcü表示他將把精力集中在slf4jlogback上 ,以糾正他在開發log4j時所犯的一些錯誤。

暫無
暫無

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

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