2012-12-03 76 views
2

當使用多個配置文件時,我無法理解log4j的配置。log4j配置文件和繼承?

我解釋一下我的情況:

  • 我有簡單的用模塊的Java EE應用程序(網絡,EJB,JPA)
  • 我還自定義服務器的身份驗證模塊(SAM)與Glassfish的處理安全性,我不直接在我的應用中使用領域。

所以,我有2個xml配置文件,因爲我的SAM(JAR文件)存儲內部GF_HOME\glassfish\lib和我的EAR文件存儲GF_HOME\glassfish\domains\domain1。 JAR和EAR都包含log4j.xml文件。

我的log4j庫位於GF_HOME\glassfish\domains\domain1\lib目錄中。

我想用2個log4j.xml文件處理配置。

所以在我的SAM的文件的log4j.xml我有這樣的:

<?xml version="1.0" encoding="UTF-8" ?> 

<appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="${catalina.home}/logs/sim.log" /> 
    <param name="Threshold" value="DEBUG" /> 
    <param name="Append" value="true" /> 
    <param name="MaxFileSize" value="1MB" /> 
    <param name="MaxBackupIndex" value="1" /> 

    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p %X{service} %X{user} [%c] %m%n" /> 
    </layout> 
</appender> 

<root> 
    <priority value="DEBUG" /> 
    <appender-ref ref="FILE" /> 
</root> 

,並在我的應用程序的log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?> 

<appender name="FILE" class="org.apache.log4j.RollingFileAppender"> 
    <param name="File" value="${catalina.home}/logs/sim.log"/> 
    <param name="Threshold" value="DEBUG"/> 
    <param name="Append" value="true"/> 
    <param name="MaxFileSize" value="1MB"/> 
    <param name="MaxBackupIndex" value="1"/> 

    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%d %-5p %X{service} %X{user} [%c] %m%n"/> 
    </layout>    
</appender> 

<logger name="com.sim" additivity="true"> 
    <level value="FATAL" />  
</logger> 

<root> 
    <priority value="DEBUG" /> 
    <appender-ref ref="FILE" /> 
</root> 

有了這個配置,我不希望看到的,因爲記錄com.sim水平在我的應用程序INFODEBUG例如水平爲FATAL,但我收到的所有日誌因爲它似乎應用了SAM log4j.xml的配置。事實上,當我刪除這個文件時,我收到了我的應用程序的日誌FATAL

似乎glassfish會「混合」或「合併」所有找到的log4j.xml文件。我不明白這個原則。

我只想用1個log4j.xml管理我的SAM,並用另一個獨立管理我的應用 log4j.xml。

我該怎麼做?

+1

DOMConfigurator.configure添加LogManager.resetConfiguration();()是關鍵!解決問題 –

+0

如果您解決了您的問題,請添加並接受一個答案,以充分解釋將來會有類似問題的其他人的解決方案。 – Cephalopod

回答

1

要回答我的帖子:

請記住,我有我的EAR的lib目錄裏的JAR文件的log4j.xml EAR文件。

要應用新的log4j的配置中,我創建在啓動時推出新的servlet和使用DOMConfigurator.configure()(請注意,如果你的工作與屬性文件必須使用PropertyConfigurator.configure()DOMConfigurator.configure())。

這裏是我的servlet:

public class Log4jInit implements Servlet { 

@Override 
public void destroy() {} 

@Override 
public ServletConfig getServletConfig() {return null;} 

@Override 
public String getServletInfo() {return null;} 

@Override 
public void init(ServletConfig arg0) throws ServletException { 

    try{   
     DOMConfigurator.configure(getClass().getClassLoader().getResource("log4j.xml"));    
    }catch(Exception e){ 
     System.out.println("Log4jInit Exception : " + e); 
    } 

} 

@Override 
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {} 

} 

另外,不要忘了修改web.xml文件:

<servlet> 
    <servlet-name>Log4j Servlet</servlet-name> 
    <servlet-class>your.package.Log4jInit</servlet-class> 
    <load-on-startup> 1 </load-on-startup> 
</servlet> 

而這一切。

如果您想添加/覆蓋以前的log4j配置,請保留此代碼。

如果要重置先前的配置,前LogManager.resetConfiguration(...);