log4j配置文件和继承?

时间:2012-12-03 11:00:46

标签: java configuration log4j

使用多个配置文件时,我无法理解log4j的配置。

我解释了我的情况:

  • 我有一个简单的Java EE应用程序,包含模块(web,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>

使用此配置,我不希望在我的应用中看到INFODEBUG的级别,因为记录器com.sim级别为FATAL但我收到所有日志,因为它似乎应用SAM log4j.xml的配置。实际上,当我删除此文件时,我会收到我的应用程序级别FATAL的日志。

似乎glassfish“混合”或“合并”找到的所有log4j.xml文件。我不太了解这个原则。

我只想用1 log4j.xml管理我的SAM,并使用另一个独立 log4j.xml管理我的应用。

我该怎么做?

1 个答案:

答案 0 :(得分: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();

之前添加LogManager.resetConfiguration(...);