9

我有一个 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 的日志。无论如何要创建单独的应用程序日志吗?

4

4 回答 4

8

事实证明,由于类加载器,这是不可能的。类加载器层次结构如下:

应用程序类加载器 -> Ejb 类加载器 -> war 类加载器

要为单个战争创建单独的日志,可以将 log4j.jar 放入战争中,让 log4j 使用战争类加载器。但是由于app1-ejb.jar和app2-ebj.jar都需要用到log4j,所以log4j.jar只能放在顶层。所以 log4j 处于应用程序类加载器级别。

我可以指定一个 log4j 配置来将不同的包记录到不同的文件中。但是对于像spring这样的普通库,日志是不能分离的。

于 2009-04-20T03:50:11.787 回答
1

它不起作用的原因是因为 log4j 存在于根位置,而是让每个战争在其 WEB-INF/lib 目录中都有一个 Log4j.jar 并从根目录中删除 log4j.jar。

有关这方面的更多信息,请参阅我在此 http://techcrawler.wordpress.com/上的博客文章

于 2010-06-22T11:09:03.903 回答
0

您还可以通过在代码中使用 PropertyConfigurator 动态更改属性文件中的 FILE 属性来实现此目的。

于 2009-09-23T12:59:32.393 回答
0

Logback 是解决此问题的可行解决方案。在查看了不同的 hack 以使其与 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>

${logback.configuration.filepath}在 Maven 过滤期间被配置文件的 webapp 外部的确切路径替换(类似于/opt/server/conf/loback.included.conf)。

然后,logback.included.conf(这个文件是项目的一部分,用 交付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>

唯一的限制是,包含文件的内容必须与包含者之一兼容。实际上只是写规则。

于 2011-09-28T07:16:21.767 回答