1

我正在开发一个 Java EE 应用程序项目,该项目通常在模块和.war上下文中使用 log4j(版本 1.2.x)。

基本上,通过 Maven 设置的模块如下:

| # app-bundle.ear
| - app-log4j-config.jar
    | - src/main/resources/log4j.xml
| - app-backend-module.jar (ejb-module)
| - app-web-ui-module.war
| - app-web-service-module.war

所以我只有一个log4j.xml用于整个 EAR 应用程序包。

给定一个 TomEE 7.0.x 应用程序服务器环境,我需要知道哪些步骤是仅记录应用程序特定日志消息(如通过 配置log4j.xml)而不是应用程序服务器生成的消息所必需的。

例如,启动和关闭消息应该发送到,catalina.out但来自不同后端或 Web 模块(见上文)的所有日志输出都应该按照我的 log4j 配置的指定打印/记录。

我的问题是:

  1. 我是否需要以conf/system.properties任何方式调整 TomEE 的默认设置?如果是这样,究竟需要添加/编辑什么?

  2. 我应该在哪里放置log4j-<version>.jar:在TomEE 的 (a) 中或( b)与我的 EAR 包的应用程序文件夹中?lib

到目前为止我已经尝试过:

  • 在TomEE安装中log4j.xml和中-> 没有成功log4j-<version>.jarlib

  • 两者都app-log4j-config.jarlog4j-<version>.jarEAR 捆绑在一起 -> 没有成功

  • 与捆绑一起log4j.xml提取- > 没有成功apps/projectlog4j-<version>.jar

任何帮助都会非常受欢迎。

编辑:我在 PLUS 变体中使用 TomEE 7.0.1。

EDIT-2:ear通过 Maven 生成,如下所示:

<dependencies>
    <dependency>
        <groupId>de.myapp</groupId>
        <artifactId>app-log4j-config</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>de.myapp</groupId>
        <artifactId>app-backend-module</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>ejb</type>
    </dependency>
    <dependency>
        <groupId>de.myapp</groupId>
        <artifactId>app-web-ui-module</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>war</type>
    </dependency>
      <dependency>
        <groupId>de.myapp</groupId>
        <artifactId>app-web-service-module</artifactId>
        <version>1.0-SNAPSHOT</version>
        <type>war</type>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
        <type>jar</type>
        <exclusions>
            <!-- This dependency will be provided globally in the TomEE deployment -->
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
        <type>jar</type>
    </dependency>
</dependencies>

<build>
    <finalName>app-bundle</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.10.1</version>
            <!-- configuring the ear plugin -->
            <configuration>
                <modules>
                    <webModule>
                        <groupId>de.myapp</groupId>
                        <artifactId>app-web-service-module</artifactId>
                    </webModule>
                    <webModule>
                        <groupId>de.myapp</groupId>
                        <artifactId>app-web-ui-module</artifactId>                         
                    </webModule>
                    <ejbModule>
                        <groupId>de.myapp</groupId>
                        <artifactId>app-backend-module</artifactId>
                    </ejbModule>                        
                    <jarModule>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                        <includeInApplicationXml>true</includeInApplicationXml>
                    </jarModule>
                    <jarModule>
                        <groupId>log4j</groupId>
                        <artifactId>log4j</artifactId>
                        <includeInApplicationXml>true</includeInApplicationXml>
                    </jarModule>
                </modules>
            </configuration>
        </plugin>
    </plugins>
</build>

是这样的log4j.xml

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern"
               value="%d{ISO8601} %-5p [%t] %c{1}(%L): %m%n"/>
    </layout>
</appender>

<appender name="DEBUGFILE" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd"/>
    <param name="file" value="logs/app-bundle-DEBUG.log"/>
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c{1}(%L): %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="debug"/>
    </filter>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="info"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

<appender name="INFOFILE" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd"/>
    <param name="file" value="logs/app-bundle-INFO.log"/>
    <param name="Append" value="true"/>
    <param name="Threshold" value="INFO"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c{1}(%L): %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="info"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

<appender name="WARNFILE" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd"/>
    <param name="file" value="logs/app-bundle-WARN.log"/>
    <param name="Append" value="true"/>
    <param name="Threshold" value="WARN"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c{1}(%L): %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="warn"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

<appender name="ERRORFILE" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="datePattern" value="'.'yyyy-MM-dd"/>
    <param name="file" value="logs/app-bundle-ERROR.log"/>
    <param name="Append" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %-5p [%t] %c{1}(%L): %m%n"/>
    </layout>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="error"/>
    </filter>
    <filter class="org.apache.log4j.varia.LevelMatchFilter">
        <param name="LevelToMatch" value="fatal"/>
    </filter>
    <filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>

<logger name="de.myapp">
    <level value="INFO"/>
</logger>

<root>
    <level value="WARN"/>
    <!--
    <appender-ref ref="CONSOLE"/>
    -->
    <appender-ref ref="ERRORFILE"/>
    <appender-ref ref="WARNFILE"/>
    <appender-ref ref="INFOFILE"/>
    <appender-ref ref="DEBUGFILE"/>
</root>

EDIT-3:我尝试通过 Maven 构建一个瘦战争文件,以通过以下方式构建上述lib目录:

  <defaultLibBundleDir>lib/</defaultLibBundleDir>
  <skinnyWars>true</skinnyWars>

这也不成功。

EDIT-4:我已经sl4j-api.jar通过

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>${slf4j.version}</version>
   <type>jar</type>
</dependency>

<jarModule>
     <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <includeInApplicationXml>true</includeInApplicationXml>
</jarModule>

在 TomEE 启动时,文件会按预期在logs目录中创建。但是,日志输出仍然进入catalina.out而不是在指定的文件中。

EDIT-5:我没有通过 Maven 正确重建项目。最后,EAR 捆绑模块添加到问题sl4j-api.jar的解决方案!

4

2 回答 2

2

通常你应该把 log4j* 放在耳朵的 lib 部分。究竟什么不适用于此设置?

编辑:还确保您在 slf4j 中添加 slf4j-api - 如果您提供自己的 slf4j 实现,否则它将使用容器一

于 2016-08-04T18:21:46.333 回答
2

正如建议的那样,问题确实与slf4j-api“.ear”包中的缺失有关。

为了追查这个问题,我创建了一个Github 示例,这是一个如何在上下文中slf4j与 TomEE集成的示例。ear

您需要确保:

  1. slf4j-*并且自定义实现需要作为jar模块捆绑在ear

  2. 共享记录器配置需要在自己的模块中提供,该模块作为jar模块捆绑在ear

希望这可以帮助遇到同样问题的人。

于 2016-08-08T08:45:22.817 回答