2009-04-18 54 views
9

我有類似的結構阿耳:如何在單個EAR中爲多個戰爭配置多個log4j?

APP.ear 
- APP1.war 
    - WEB-INF/classes/log4j.properties 
- APP2.war 
    - WEB-INF/classes/log4j.properties 
- app1-ejb.jar 
- app2-ejb.jar 
- log4j.jar 
- spring.jar 
- commons-lang.jar (...and other jar) 

我希望每個WAR有自己的應用程序日誌。但似乎上述配置不起作用。登錄APP1,APP2進入APP1的日誌。無論如何創建單獨的應用程序日誌?

回答

7

事實證明,由於類加載器是不可能的。該classloader層次結構是這樣的:

應用類加載器 - > EJB類加載器 - >戰爭類加載器

爲了有一個sepearte日誌,個人戰,一個可以把log4j.jar內部戰爭,讓使用log4j的戰爭類加載器。但是,由於app1-ejb.jar和app2-ebj.jar都需要使用log4j,因此只能將log4j.jar放在頂層。所以log4j在應用程序類加載器級別上。

我可以指定一個log4j配置將不同的包記錄到不同的文件。但對於像春天這樣的公共圖書館來說,日誌不能分開。

+0

「但是,由於app1-ejb.jar和app2-ebj.jar都需要使用log4j,所以log4j.jar只能放在最高級別。」你不能只在每個WAR文件中包含一個log4j.jar嗎? – CodeClimber 2012-10-04 10:36:43

0

您也可以通過使用代碼中的PropertyConfigurator動態更改屬性文件中的FILE屬性來實現此目的。

1

它沒有工作的原因是因爲log4j存在於根目錄位置,而是讓每個war在其WEB-INF/lib目錄中都有一個Log4j.jar,並從根目錄中刪除log4j.jar。

有關此 http://techcrawler.wordpress.com/

0

的logback這是指我的博客文章的詳細信息是解決這一問題的可行解決方案。在瀏覽不同的黑客來使這個工作與log4j,我們已決定切換到Logback。我在webapp中使用了Logback jar的下列配置。

,其包括外部文件中的web應用程序內

甲的logback文件:

<?xml version="1.0" encoding="UTF-8" ?> 
    <configuration scan="true" scanPeriod="10 seconds"> 
     <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"> 
      <resetJUL>true</resetJUL> 
     </contextListener> 

     <contextName>${project.artifactId}</contextName> 

     <jmxConfigurator /> 

     <include file="${logback.configuration.filepath}" /> 
    </configuration> 

${logback.configuration.filepath}通過的準確路徑Maven的濾波期間更換,外部的配置文件的web應用(像/選擇/服務器/conf/loback.included.conf)。

然後,將logback.included.conf的內容(該文件是projetct的一部分,與build-helper:attach-artifact遞送,所以${project.artifactId}被Maven的濾波期間也替換):

<?xml version="1.0" encoding="UTF-8" ?> 
    <included> 
     <appender name="file" class="ch.qos.logback.core.FileAppender"> 
      <file>/var/log/server/${project.artifactId}.log</file> 
      <encoder> 
       <pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern> 
      </encoder> 
     </appender> 

     <root level="INFO"> 
      <appender-ref ref="file" /> 
     </root> 
    </included> 

唯一的限制,所包括的內容文件必須符合包裝者之一。事實上只是寫規則。