4

我正在将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 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>

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

  1. logback 认为属性为空时未定义。所以我不得不使用"./"而不是""(空字符串)。
  2. isDefined("catalina.home")true仅在 Tomcat(操作系统是 Windows)中启动时才会产生结果。不知道为什么要定义“catalina.home”,我有一个名为“CATALINA_HOME”的环境变量,但它似乎表明 TomCat 在启动时设置了“catalina.home”。

我仍然想在 logback 配置(项目根目录)中插入一个 Maven var,但恐怕我必须接受上面的解决方案。

4

2 回答 2

3

条件配置(if 语句)需要 Janino。Janino 在您的课程路径上可用吗?您是否将调试属性设置为 true,如下所示?

<configuration debug="true">...</configuration>

将 debug 属性设置为 true 将在控制台上打印 logback 的内部状态消息,这对于跟踪 logback 配置问题非常有用。

至于分离问题,你考虑过按主机名分离吗?Logback 自动将 HOSTNAME 定义为变量。因此,以下将根据 productionHost 和其他主机定义两个单独的日志记录设置。

<if condition='property("HOSTNAME").contains("productionHost")'>
    <then>...</then>
    <else>config for test</else>
</if>

实际上,我不明白为什么根据“logDir”定义的分离不足以实现分离。

于 2012-05-31T08:46:38.087 回答
0

我建议为集成测试设置单独的模块,您可以在其中放置不同的日志文件配置(src/test/resources),并且单元测试的配置将来自您放置单元测试的模块。

于 2012-05-30T21:50:45.287 回答