4

TomcatでホストされているWebアプリケーションにSL4jLogbackを使用しています。私は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つのことが奇妙です。

  1. logbackは、プロパティが空の場合、プロパティは未定義であると見なします。そのため、 (空の文字列)"./"の代わりに使用する必要がありました。""
  2. isDefined("catalina.home")Tomcatで起動した場合にのみ結果が得trueられます(OSはWindowsです)。とにかく「catalina.home」が定義されている理由がわかりません。「CATALINA_HOME」という環境変数がありますが、TomCatが開始時に「catalina.home」を設定していることがわかります。

私はまだMaven変数をログバック構成(プロジェクトルート)に挿入したいのですが、上記の解決策を実行する必要があるのではないかと心配しています。

4

2 に答える 2

3

条件付き構成(ifステートメント)にはJaninoが必要です。Janinoはクラスパスで利用できますか?次のようにdebug属性をtrueに設定しましたか?

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

debug属性をtrueに設定すると、ログバックの内部ステータスメッセージがコンソールに出力されます。これは、ログバック構成の問題を追跡するのに非常に役立ちます。

分離の質問については、ホスト名による分離を検討しましたか?Logbackは、HOSTNAMEを変数として自動的に定義します。したがって、以下は、productionHostと他のホストに基づいて2つの別々のロギング設定を定義します。

<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 に答える