我正在使用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:
<appender name="A2" class="ch.qos.logback.core.FileAppender">
<file>myapp.log</file>
...
集成测试和webapp的日志文件已经巧合了:对于集成测试,它是我项目的根,对于webapp,它是Eclipse目录。所以我在logback config中引入了一个日志文件位置:
<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应用程序的日志文件? 我找到了这个link,但我更喜欢只有配置的解决方案。我真的很想插入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>
这个解决方案中有两件事很奇怪:
"./"
而不是""
(空字符串)。isDefined("catalina.home")
才会生成true
。不知道为什么“catalina.home”被定义了,我有一个名为“CATALINA_HOME”的环境变量,但是它开始时TomCat正在设置“catalina.home”。我仍然想在logback配置(项目根目录)中插入Maven var,但我恐怕不得不忍受上面的解决方案。
答案 0 :(得分:3)
条件配置(if语句)需要Janino。 Janino是否可以上课?您是否将debug属性设置为true,如下所示?
<configuration debug="true">...</configuration>
将debug属性设置为true将在控制台上打印logback的内部状态消息,这对于跟踪回溯配置问题非常有用。
至于分居问题,您是否考虑过主机名分隔? Logback自动将HOSTNAME定义为变量。因此,以下内容将基于productionHost和其他主机定义两个单独的日志记录设置。
<if condition='property("HOSTNAME").contains("productionHost")'>
<then>...</then>
<else>config for test</else>
</if>
实际上,根据&log.dir&#39;的定义,我不明白为什么分离。不足以实现分离。
答案 1 :(得分:0)
我建议在集成测试中使用单独的模块,您可以在其中放置不同的日志文件配置(src / test / resources),并且单元测试的配置将来自您放置单元的模块测试进入。