Configuration 如何在一个EAR中为不同的战争配置多个log4j?
我的耳朵有如下结构:Configuration 如何在一个EAR中为不同的战争配置多个log4j?,configuration,log4j,war,ear,Configuration,Log4j,War,Ear,我的耳朵有如下结构: APP.ear - APP1.war - WEB-INF/classes/log4j.properties - APP2.war - WEB-INF/classes/log4j.properties - app1-ejb.jar - app2-ejb.jar - log4j.jar - spring.jar - commons-lang.jar (...and other jar) 我希望每一场战争都有自己的应用程序日志。但上述配置似乎不起作用。APP1
APP.ear
- APP1.war
- WEB-INF/classes/log4j.properties
- APP2.war
- WEB-INF/classes/log4j.properties
- app1-ejb.jar
- app2-ejb.jar
- log4j.jar
- spring.jar
- commons-lang.jar (...and other jar)
我希望每一场战争都有自己的应用程序日志。但上述配置似乎不起作用。APP1和APP2的日志转到APP1的日志。还有创建单独的应用程序日志的方法吗?事实证明,由于类加载器的原因,这是不可能的。类加载器层次结构如下所示: 应用程序类加载器->Ejb类加载器->war类加载器
要为单个war创建单独的日志,可以将log4j.jar放在war中,让log4j使用war类加载器。但是由于app1-ejb.jar和app2-ebj.jar都需要使用log4j,因此log4j.jar只能放在顶层。因此log4j处于应用程序类加载器级别
我可以指定一个log4j配置来将不同的包记录到不同的文件中。但是对于像spring这样的公共库,日志是不能分开的。您也可以通过在代码中使用PropertyConfigurator动态更改属性文件中的FILE属性来实现这一点。因为log4j位于根位置,所以它不能工作,相反,让每个war在其WEB-INF/lib目录中都有一个Log4j.jar,并从根目录中删除Log4j.jar 有关这方面的更多信息,请参阅我的博客文章
Logback是解决此问题的可行解决方案。在研究了使用log4j的各种黑客之后,我们决定切换到Logback。我在webapp中使用了Logback jar的以下配置 webapp中的一个Logback文件,其中包括一个外部文件:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="10 seconds">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<contextName>${project.artifactId}</contextName>
<jmxConfigurator />
<include file="${logback.configuration.filepath}" />
</configuration>
仅限于此,所包含文件的内容必须与其中一个includer兼容。实际上只是编写规则。“但是由于app1-ejb.jar和app2-ebj.jar都需要使用log4j,因此log4j.jar只能放在顶层。”您不能在每个WAR文件中都包含一个log4j.jar吗?
<?xml version="1.0" encoding="UTF-8" ?>
<included>
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>/var/log/server/${project.artifactId}.log</file>
<encoder>
<pattern>[@/%contextName] %date{ISO8601} [%-5level] %thread:[%logger] %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="file" />
</root>
</included>