使用多个配置文件时,我无法理解log4j的配置。
我解释了我的情况:
因此,我有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>
使用此配置,我不希望在我的应用中看到INFO
或DEBUG
的级别,因为记录器com.sim
级别为FATAL
但我收到所有日志,因为它似乎应用SAM log4j.xml的配置。实际上,当我删除此文件时,我会收到我的应用程序级别FATAL
的日志。
似乎glassfish“混合”或“合并”找到的所有log4j.xml文件。我不太了解这个原则。
我只想用1 log4j.xml管理我的SAM,并使用另一个独立 log4j.xml管理我的应用。
我该怎么做?
答案 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(...);