Другой лог-файл для интеграционного тестирования
Я использую 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 вещи странные в этом решении:
- logback считает, что свойство не определено, когда оно пустое. Поэтому я должен был использовать
"./"
вместо""
(пустой строки). 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), и конфигурация для модульных тестов будет выходить из модуля, в который вы поместили модульные тесты.