当使用多个配置文件时,我很难理解 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>
使用此配置,我不希望在我的应用程序中看到例如 INFO
或 DEBUG
级别,因为对于记录器 com.sim
级别是 FATAL
但我收到了所有日志,因为它似乎应用了 SAM log4j.xml 的配置。事实上,当我删除这个文件时,我收到了我的应用程序的 FATAL
级别的日志。
似乎 glassfish“混合”或“合并”了找到的所有 log4j.xml 文件。原理不太懂。
我只想使用 1 个 log4j.xml 管理我的 SAM,并使用另一个独立 log4j.xml 管理我的应用程序。
我该怎么做?
最佳答案
回复我的帖子:
请记住,我在我的 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();
关于java - log4j 配置文件和继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13681875/