web-dev-qa-db-ja.com

単一のプロジェクトでlogbackを使用して複数の構成を使用するにはどうすればよいですか?

Logbackの構成ファイルはクラスパス上にあるため、Eclipseプロジェクト固有であり、これは私が望むものではありません。複数のJava=ユーティリティを使用しており、それらのすべてが単一のプロジェクト(これはクラスパスを共有している)にあります)を使用しており、それらのいくつかに対して特定の構成を使用する必要があります。

変数置換とJoram設定を試しましたが、何もうまくいきませんでした。これはおそらく私のせいだったので、いつか解決するつもりですが、今のところ簡単な解決策が必要です。

46
maaartinus

オプション1:logback.configurationFileシステムプロパティを使用して、logback構成ファイルの場所を指定します。これにより、実際にはプロジェクトごとに複数の構成ファイルを持つことができます。 logback documentation にあるように、このプロパティの値は、URL、クラスパス上のリソース、またはアプリケーション外部のファイルへのパスにすることができます。例えば:
_-Dlogback.configurationFile=/path/to/config.xml_

オプション2:変数置換を使用して、システムプロパティでログファイルの名前を設定します。例えば:

  1. アペンダーはファイルを次のように設定できます。
    _<file>/var/tmp/${mycompany.myapplication}.log</file>_
  2. そして、Javaの起動時にその変数の値を指定できます。
    _-Dmycompany.myapplication=SomeUtility_

オプション3:システムプロパティでロガーレベルを設定します。これにより、より多く/より少ないログを記録できます。例えば:

  1. これをlogback設定ファイルに入れてください:
    _<logger name="com.mycompany" level="${mycompany.logging.level:-DEBUG}"/>_
    これにより、指定したパッケージはデフォルトでデバッグレベルでログに記録されます。
  2. 特定のアプリケーションでロギングレベルをINFOに変更する場合は、そのアプリケーションを起動するときに、以下をJavaに渡します。
    _-Dmycompany.logging.level=INFO_

オプション4:システムプロパティのコマンドラインパラメータをJavaに渡して、アペンダーを追加/削除します。これにより、さまざまな場所にログを記録できます。 条件付き処理にはjaninoが必要 であることに注意してください。例えば:

  1. _<appender-ref>_を配置する場所ならどこでも、これをログバック構成ファイルに入れ、ref値を独自の_<appender>_ sの1つに変更します。
    <if condition="property("mycompany.logging.console").equalsIgnoreCase("true")"> <then><appender-ref ref="STDOUT"/></then></if>
  2. このアペンダーを有効にする場合は、そのアプリケーションを起動するときにJavaに以下を渡します。
    _-Dmycompany.logging.console=true_

システムプロパティに関しては、それらをJavaに_-D_引数として渡します。
_Java -Dmy.property=/path/to/config.xml com.mycompany.MyMain_

65
jtoberon

Spring Bootアプリケーションでは、logback構成ファイル内でSpringプロファイルを参照できます。

この記事 を参照してください。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <springProfile name="dev">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>
          %d{HH:mm:ss.SSS} | %5p | %logger{25} | %m%n
        </pattern>
        <charset>utf8</charset>
      </encoder>
    </appender>
    <root level="DEBUG">
      <appender-ref ref="CONSOLE"/>
    </root>
  </springProfile>
  ...
1

Leonidas blog に基づく別のオプションを使用しました。オプションのプロパティファイル(environment.properties)があり、環境プロパティとカスタム構成(logback-env-test.xmlなど)が含まれています。これらのファイルはすべてクラスパス上にある必要があります。

プロパティファイルが存在し、logEnvプロパティを定義している場合。

logEnv = dev66

logbackは、logback-env-dev66.xmlからカスタム構成を見つけて含めようとします

<included>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</included>

余計にそれはデフォルト(<else>セクション)設定へのフォールバックになります。カスタム構成ファイルでは、<included>ではなく<configuration>タグが使用されていることに注意してください。

上記すべてを管理するlogback.xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="5 seconds" debug="true">
    <!-- To skip error if property file doesn't exist -->
    <define name="propExists" class="ch.qos.logback.core.property.ResourceExistsPropertyDefiner">
        <resource>environment.properties</resource>
    </define>
    <if condition='${propExists}'>
        <then>
            <property resource="environment.properties" />
        </then>
    </if>
    <!-- If specific configuration exists, load it otherwise fallback to default (<else> section)  -->
    <define name="confExists" class="ch.qos.logback.core.property.ResourceExistsPropertyDefiner">
        <resource>logback-env-${logEnv}.xml</resource>
    </define>
    <if condition='${confExists}'>
        <then>
            <include resource="logback-env-${logEnv}.xml"/>
        </then>
        <else>
            <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
                </encoder>
            </appender>
            <root level="INFO">
                <appender-ref ref="STDOUT" />
            </root>
        </else>
    </if>
</configuration>
0
foal