2

当使用多个配置文件时,我很难理解 log4j 的配置。

我解释我的情况:

  • 我有一个带有模块(web、ejb、jpa)的简单 Java EE 应用程序
  • 我还有自定义服务器身份验证模块 (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 管理我的应用程序。

我怎样才能做到这一点?

4

1 回答 1

1

回答我的帖子:

请记住,我在 EAR 的 lib 目录中的 JAR 中有带有 log4j.xml 文件的 EAR 文件。

为了应用新的 log4j 配置,我创建了在启动时启动并使用的新 servlet DOMConfigurator.configure()(请注意,如果您使用属性文件,则必须使用PropertyConfigurator.configure()not DOMConfigurator.configure())。

这是我的小服务程序:

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(...);

于 2012-12-05T13:43:15.363 回答