如何配置不同的战争多的log4j在一个单一的耳朵?
-
11-09-2019 - |
题
我有类似的结构一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)
我希望每个WAR有自己的应用程序日志。但似乎上面的配置不起作用。日志APP1和APP2去APP1的日志。反正是有创建单独的应用程序日志?
解决方案
事实证明,它由于类加载器是不可能的。类加载器层次是这样的:
应用程序的类加载器 - > EJB类加载器 - >战类加载器
要拥有sepearte日志,个人战,一个可以把log4j.jar内部战争,让使用log4j的战争类加载器。但随着这两个APP1-ejb.jar和APP 2-ebj.jar还需要使用log4j的,将log4j.jar只能放置在顶层。所以log4j的是应用程序类加载水平。
我可以指定一个单一的log4j配置到不同的包记录到不同的文件。但是,对于像弹簧的公用库中,日志不能sepearted。
其他提示
它没有工作,因为log4j的存在于根的位置,而不是让每个战争在其WEB-INF / lib目录一个Log4j.jar和从根部除去log4j.jar,原因
有关此指这个我的博客文章的详细信息 http://techcrawler.wordpress.com/
您也可以做到这一点通过动态地改变在属性文件的属性文件中使用PropertyConfigurator在代码。
的logback是一个可行的解决方案来解决这个问题。有各地不同的黑客外观,使与log4j的这项工作后,我们决定改用的logback。我已经使用与所述web应用程序的logback内部罐的下面的配置。
web应用程序内部的文件的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>
${logback.configuration.filepath}
通过的准确路径Maven的滤波期间更换,外部的配置文件的web应用(类似 /opt/server/conf/loback.included.conf )。
然后,将logback.included.conf
的内容(该文件是projetct,与build-helper:attach-artifact
递送的一部分,所以${project.artifactId}
被Maven的滤波期间也替换):
<?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>
唯一的限制,所包含的文件的内容必须符合的包入的一个。只是写在事实上的规则。