TomcatでホストされているWebアプリケーションにSL4jとLogbackを使用しています。私は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>
ログバック構成内に、ファイルベースのアペンダーがあります。
<appender name="A2" class="ch.qos.logback.core.FileAppender">
<file>myapp.log</file>
...
統合テストとWebアプリケーションのログファイルは偶然に分離されています。統合テストの場合はプロジェクトのルートであり、Webアプリケーションの場合はEclipseディレクトリでした。そこで、logbackconfig内にログファイルの場所を導入しました。
<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
、クラスパスでジャニーノを忘れてしまいました(チェキのおかげで)。統合テストのログ出力とWebアプリケーションのログ出力の両方が同じログファイルに記録されます。だから私の質問:
統合テストWebアプリケーションのログファイルをどのように分離できますか?このリンクを見つけましたが、構成のみのソリューションをお勧めします。私は本当にMavenプロパティを挿入したいと思います。
更新 私の問題は解決しました。まず、ログバック構成:
<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>
アペンダーファイルのプロパティは次のようになります。
<file>${logDir}/myapp.log</file>
このソリューションでは、2つのことが奇妙です。
- logbackは、プロパティが空の場合、プロパティは未定義であると見なします。そのため、 (空の文字列)
"./"
の代わりに使用する必要がありました。""
isDefined("catalina.home")
Tomcatで起動した場合にのみ結果が得true
られます(OSはWindowsです)。とにかく「catalina.home」が定義されている理由がわかりません。「CATALINA_HOME」という環境変数がありますが、TomCatが開始時に「catalina.home」を設定していることがわかります。
私はまだMaven変数をログバック構成(プロジェクトルート)に挿入したいのですが、上記の解決策を実行する必要があるのではないかと心配しています。