2010-11-23 65 views
7

我有很多web應用程序來構建/打包,我想分享他們的通用庫。如何使用slf4j/logback打包webapp?

關於日誌記錄,我想捆綁SLF4J的API與每個應用程序,但考慮到實現由我的容器提供的(這是目前的Tomcat)

要做到這一點,我複製了兩瓶,logback-經典和logback-core到$ CATALINA \ lib目錄中。

不幸的是,在運行時,SLF4J之間並結合其執行失敗,出現以下錯誤信息:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 

我設法使它工作的唯一方法是捆綁在戰爭文件的JAR時。

任何想法?

回答

8

這不會按預期工作。記錄框架使用很多靜態變量(又名全局變量)。

因此,每次加載日誌配置時,它都會將其替換爲將所有應用程序部署到您的容器。這通常不是你想要的。

使用WAR對日誌實現進行捆綁,以便Web容器可以確保每個Web應用程序都有自己的一組全局變量。

[編輯]如果你真的想要控制所有具有相同日誌配置的應用程序,你必須將所有的日誌類移動到容器中。這包括slf4j

我強烈建議把日誌配置放入一個JAR並放在那裏。或者部署一個只包含儘可能少代碼的虛擬web應用程序(所以Tomcat將加載它)加上logback.xml

否則,應用程序的啓動順序將決定當您到達某個點時的日誌記錄日誌配置必須改變。

+0

「它將取代它的所有應用程序部署到您的容器。」這實際上正是我想要的。 – David 2010-11-23 22:07:15

+1

好的...在這種情況下。你必須把所有的日誌類(包括slf4j)移到`$ CATALINA/lib`中。 – 2010-11-24 08:00:57

1

做你尊重

放置一個(也是唯一一個)SLF4J-nop.jar,SLF4J-simple.jar,SLF4J-log4j12.jar,SLF4J-jdk14.jar或的logback-classic.jar的在班級路徑上應該解決問題。

如果您使用例如冬眠它可能在你的classpath介紹SLF4J-log4j12.jar,所以有可能在類路徑中有多於一個SLF4J實施

對我來說它的工作原理與SLF4J和log4j的

0

我們把所有的罐子SLF4J &的logback成共享/ lib的Tomcat。然後,我們將全局logback.xml放入共享/類中。

但我仍然不知道這是否是一種好的做法。 我們必須由用戶管理日誌,所以我們設置了MDC以便使用SiftingAppender。 我有一個問題,正在等待這個問題的答案:(