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>