如何通过 log4j.xml 在 TomEE 7.0.1 中启用 EAR 应用程序 log4j 日志记录?
How to enable EAR app log4j logging in TomEE 7.0.1 via log4j.xml?
我正在开发一个 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
所以对于整个 EAR 应用程序包,我只有一个 log4j.xml
。
给定 TomEE 7.0.x 应用程序服务器环境,我需要知道哪些步骤是必要的,以仅记录应用程序特定的日志消息(通过 log4j.xml
配置)但 不是 应用程序服务器生成的消息。
例如启动和关闭消息应该发送到 catalina.out
,但是来自不同后端或 Web 模块(见上文)的所有日志输出都应该按照我的 log4j 配置指定的方式打印/记录。
我的问题是:
我是否需要以任何方式调整 TomEE 的默认 conf/system.properties
?如果是这样,究竟需要什么 added/edited?
我把 log4j-<version>.jar
放在哪里:在 TomEE 的 (a) lib
或 (b ) 我的 EAR 包的应用程序文件夹?
到目前为止我尝试过的:
TomEE 安装 lib
中的 log4j.xml
和 log4j-<version>.jar
-> 没有成功
app-log4j-config.jar
和 log4j-<version>.jar
都与 EAR 捆绑在一起 -> 没有成功
在 apps/project
中提取 log4j.xml
并捆绑 log4j-<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 构建一个瘦 war 文件,以通过以下方式构建提到的 lib
目录:
<defaultLibBundleDir>lib/</defaultLibBundleDir>
<skinnyWars>true</skinnyWars>
这个也不成功
EDIT-4:我已经通过
将sl4j-api.jar
添加到EAR包中
<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 正确重建项目。最后,添加 sl4j-api.jar
到 EAR 包模块 是问题的解决方案!
通常你应该把log4j*放在ear的lib部分。究竟什么不适用于此设置?
编辑:还确保在 slf4j-api 中添加 slf4j- 如果您提供自己的 slf4j 实现,否则它将使用容器 one
问题确实与所建议的“.ear”包中缺少 slf4j-api
有关。
为了追查问题,我创建了一个 Github Sample,这是一个如何在 ear
上下文中将 slf4j
与 TomEE 集成的示例。
您需要确保:
slf4j-*
并且自定义实现需要作为 jar
模块捆绑在 ear
中
共享记录器配置需要在自己的模块中提供,在ear
中被捆绑为jar
模块
希望这对遇到同样问题的人有所帮助。
我正在开发一个 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
所以对于整个 EAR 应用程序包,我只有一个 log4j.xml
。
给定 TomEE 7.0.x 应用程序服务器环境,我需要知道哪些步骤是必要的,以仅记录应用程序特定的日志消息(通过 log4j.xml
配置)但 不是 应用程序服务器生成的消息。
例如启动和关闭消息应该发送到 catalina.out
,但是来自不同后端或 Web 模块(见上文)的所有日志输出都应该按照我的 log4j 配置指定的方式打印/记录。
我的问题是:
我是否需要以任何方式调整 TomEE 的默认
conf/system.properties
?如果是这样,究竟需要什么 added/edited?我把
log4j-<version>.jar
放在哪里:在 TomEE 的 (a)lib
或 (b ) 我的 EAR 包的应用程序文件夹?
到目前为止我尝试过的:
TomEE 安装
lib
中的log4j.xml
和log4j-<version>.jar
-> 没有成功app-log4j-config.jar
和log4j-<version>.jar
都与 EAR 捆绑在一起 -> 没有成功在
apps/project
中提取log4j.xml
并捆绑log4j-<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 构建一个瘦 war 文件,以通过以下方式构建提到的 lib
目录:
<defaultLibBundleDir>lib/</defaultLibBundleDir>
<skinnyWars>true</skinnyWars>
这个也不成功
EDIT-4:我已经通过
将sl4j-api.jar
添加到EAR包中
<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 正确重建项目。最后,添加 sl4j-api.jar
到 EAR 包模块 是问题的解决方案!
通常你应该把log4j*放在ear的lib部分。究竟什么不适用于此设置?
编辑:还确保在 slf4j-api 中添加 slf4j- 如果您提供自己的 slf4j 实现,否则它将使用容器 one
问题确实与所建议的“.ear”包中缺少 slf4j-api
有关。
为了追查问题,我创建了一个 Github Sample,这是一个如何在 ear
上下文中将 slf4j
与 TomEE 集成的示例。
您需要确保:
slf4j-*
并且自定义实现需要作为jar
模块捆绑在ear
中
共享记录器配置需要在自己的模块中提供,在
ear
中被捆绑为
jar
模块
希望这对遇到同样问题的人有所帮助。