Другой лог-файл для интеграционного тестирования

Я использую SL4j и Logback для веб-приложения, размещенного в Tomcat. Я использую 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>
    ...

Файлы журнала для интеграционного теста и веб-приложения были разделены по совпадению: для интеграционного теста это был корень моего проекта, для веб-приложения это был каталог 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 работает сейчас, я забыл Янино на пути к классам (спасибо Ceki). Вывод журнала интеграции тестирования и журнала веб-приложения в одном файле журнала. Итак, мой вопрос:

Как можно разделить файлы журналов для веб-приложения тестирования интеграции? Я нашел эту ссылку, но я бы предпочел решение только с настройкой. Я действительно хотел бы вставить свойства 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>

2 вещи странные в этом решении:

  1. logback считает, что свойство не определено, когда оно пустое. Поэтому я должен был использовать "./" вместо "" (пустой строки).
  2. isDefined("catalina.home") Результаты true только при запуске в Tomcat (ОС - Windows). Не знаю, почему "catalina.home" так или иначе определяется, у меня есть переменная окружения "CATALINA_HOME", но кажется, что TomCat при запуске устанавливает "catalina.home".

Я все еще хотел бы вставить переменную Maven в конфигурацию logback (корень проекта), но я боюсь, что должен жить с решением выше.

2 ответа

Решение

Условная конфигурация (если оператор) требует Янино. Янино доступен в вашем классе? Вы установили для атрибута отладки значение true следующим образом?

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

Если для атрибута debug задано значение true, на консоли будут выводиться внутренние сообщения о состоянии обратного входа, что может быть очень полезно для отслеживания проблем конфигурации обратного входа.

Что касается вопроса о разделении, рассматривали ли вы разделение по имени хоста? Logback автоматически определяет HOSTNAME как переменную. Таким образом, следующее определит два отдельных параметра ведения журнала, основанных на productionHost и других хостах.

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

На самом деле, я не понимаю, почему разделение в соответствии с определением 'logDir' недостаточно для достижения разделения.

Я бы предложил иметь отдельный модуль для интеграционных тестов, в который вы можете поместить другую конфигурацию файла журнала (src/test/resources), и конфигурация для модульных тестов будет выходить из модуля, в который вы поместили модульные тесты.

Другие вопросы по тегам