我正在将SL4j和Logback用于托管在 Tomcat 中的 Web 应用程序。我使用 Spring 和 Maven(没有配置文件)。使用 Surefire 插件完成集成测试:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.12</version>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>integration-test</goal>
</goals>
<configuration>...</configuration>
</execution>
<execution>
<id>verify</id>
<goals>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
在 logback 配置中,我有一个基于文件的附加程序:
<appender name="A2" class="ch.qos.logback.core.FileAppender">
<file>myapp.log</file>
...
集成测试和 webapp 的日志文件是巧合分开的:对于集成测试,它是我项目的根目录,对于 webapp,它是 Eclipse 目录。所以我在 logback 配置中引入了一个日志文件位置:
<insertFromJNDI env-entry-name="java:comp/bla/logDir" as="logDir" />
<if condition='!isDefined("logDir")'>
<then>
<property name="logDir" value="${catalina.home}/logs/" />
</then>
</if>
if
结合现在的作品isDefined
,我在类路径上忘记了 Janino(感谢 Ceki)。集成测试日志输出和 Web 应用程序日志输出都在同一个日志文件中。所以我的问题:
如何分离集成测试 Web 应用程序的日志文件?我找到了这个链接,但我更喜欢只有配置的解决方案。我真的很想插入 Maven 属性。
更新 我的问题解决了。首先是logback配置:
<configuration scan="true" debug="true">
<!-- used for the production webapp -->
<insertFromJNDI env-entry-name="java:comp/bla/logDir" as="logDir" />
<if condition='!isDefined("logDir")'>
<then>
<if condition='isDefined("catalina.home")'>
<then>
<!-- used for the development webapp -->
<property name="logDir" value="${catalina.home}/logs/" />
</then>
<else>
<!-- used for the integration test -->
<property name="logDir" value="./" />
</else>
</if>
</then>
</if>
appender 文件属性如下所示:
<file>${logDir}/myapp.log</file>
此解决方案中有两件事很奇怪:
- logback 认为属性为空时未定义。所以我不得不使用
"./"
而不是""
(空字符串)。 isDefined("catalina.home")
true
仅在 Tomcat(操作系统是 Windows)中启动时才会产生结果。不知道为什么要定义“catalina.home”,我有一个名为“CATALINA_HOME”的环境变量,但它似乎表明 TomCat 在启动时设置了“catalina.home”。
我仍然想在 logback 配置(项目根目录)中插入一个 Maven var,但恐怕我必须接受上面的解决方案。