15

私は 3 つの個別のプロジェクトを持っており、それぞれに独自の logback.xml ファイルが埋め込まれています。これらの各ファイルには、ユーザーのホーム ディレクトリに共通のログ構成ファイルが含まれています。

<include file="${user_home}/loggingConfig.xml"/>

インクルード後、次の仕様があります。

<root level="error">
    <appender-ref ref="${appender:-console}" />
</root>

これにより、ユーザーはログ レベルとアペンダーを構成し、それらをコア ロギング構成ファイルで適用できます。

たとえば、 ~/loggingConfig.xml には次の行があります。

<property name="appender" value="file" />

しかし、コンソール ログを好む同僚は、その行を省略します。

問題は、ログ ファイルごとに異なるアペンダを使用したいということです。つまり、カスタマイズされた構成ファイルを読み取っているプロジェクトに基づいて、条件付きで別のアペンダーを設定したいと思います。

異なる名前の構成ファイルを読み取るように各プロジェクトを構成できることはわかっていますが、混乱を解消し、構成の共有も可能にしたいと考えています。

4

2 に答える 2

19

ドキュメンテーションは高度な構成には少し割愛されていますが、logback コンテキスト名を条件付きログの変数として使用できることがわかりました。そのため、プロジェクトごとに、プロジェクトの logback.xml ファイルでカスタム コンテキスト名を定義します。

<contextName>project1</contextName>

等...

次に、 ~/loggingConfig.xml ファイルでこれを実行できます。

<property name="appender" value="file" />

<!--if condition='property("CONTEXT_NAME").equalsIgnoreCase("project1")'>
    <then>
        <property name="appender" value="file" />
    </then>
</if-->
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project2")'>
    <then>
        <property name="appender" value="console" />
    </then>
</if>
<if condition='property("CONTEXT_NAME").equalsIgnoreCase("project3")'>
    <then>
        <property name="appender" value="file" />
    </then>
</if>

これは少し不格好になる可能性がありますが、実際には、このソリューションを使用して、さまざまなプロジェクトの単一のアペンダーで使用されるプロパティを構成していますが、独自の条件付きブロックを持たないプロジェクトのデフォルト値への適切なフォールバックを維持しています。

于 2013-04-09T19:55:28.137 に答える