用于集成测试的不同日志文件

时间:2012-05-30 15:50:10

标签: spring maven logback janino

我正在使用SL4jLogback来托管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>

ifisDefined结合使用现在,我忘记了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>

这个解决方案中有两件事很奇怪:

  1. logback认为属性为空时未定义。所以我不得不使用"./"而不是""(空字符串)。
  2. 只有在Tomcat(操作系统是Windows)中启动时,
  3. isDefined("catalina.home")才会生成true。不知道为什么“catalina.home”被定义了,我有一个名为“CATALINA_HOME”的环境变量,但是它开始时TomCat正在设置“catalina.home”。
  4. 我仍然想在logback配置(项目根目录)中插入Maven var,但我恐怕不得不忍受上面的解决方案。

2 个答案:

答案 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),并且单元测试的配置将来自您放置单元的模块测试进入。