web-dev-qa-db-ja.com

logback.xmlでSpringプロパティプレースホルダーを使用できません

Logbackを使用したSpring Bootコンソールアプリがあります。すべてのプロパティ(アプリとLogbackの両方)は、クラスパスの標準application.propertiesファイルに外部化されます。これらのプロパティはアプリ自体で適切に選択されますが、logback.xmlファイルでは選択されません。 Spring Bootが起動する前にlogback.xmlが処理されているように見えるため、ELプレースホルダーは処理されません。

例としてFileNamePatternを使用して、application.propertiesに次のようなものがあります。

log.filePattern=/%d{yyyy/MM-MMMM/dd-EEEE}

そしてlogback.xmlでは、これがあります:

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <FileNamePattern>${log.logDirectory}${log.filePattern}.log
    </FileNamePattern>
</rollingPolicy>

アプリを実行すると、次のようなエラーが表示されます。

ERROR in ch.qos.logback.core.joran.spi.Interpreter@24:25 - 
RuntimeException in Action for tag [rollingPolicy]
Java.lang.IllegalStateException: FileNamePattern
[log.logDirectory_IS_UNDEFINEDlog.filePattern_IS_UNDEFINED.log]
does not contain a valid DateToken

同様のコードは、他のSpring(Spring Bootではない)アプリでも問題なく動作するため、Spring Bootの動作が少し異なるのではないかと思っています。

溶液:

返信@Garyをありがとう! Spring ELとLogbackの変数の違いについて知っておくとよいのですが、これらの変数の解析を担当するのはSpringであると想定していました。私didには要素がありますが、それで考えがつきました。

私のapplication.propertiesファイルはjarの外にあったので、Logbackはどこにあるかわかりませんでした。 Spring関連のプロパティを外部のapplication.propertiesファイルに保持し、ロギング関連のプロパティをapplication-internal.propertiesファイル((insideに移動) jar)、およびLogbackにthatファイル(<property resource="application-internal.properties" />)すべてが期待どおりに動作するようになりました!

34
brmc72

${...}は、Springでは「Spring EL」ではありません。プロパティのプレースホルダーです。

Logback「変数」とSpring「Property Placeholders」を混同していると思います。

それらはたまたま同じ構文${...}を使用しています。

logbackは、Springプロパティのプレースホルダーメカニズムについては何も知りません。その逆も同様です。厳密にSpring(ブート)の概念であるapplication.properties/application.ymlではなく、ログバックドキュメントに従ってログバック変数を構成する必要があります。

編集:

ログバックドキュメントをざっと見てから、

<property resource="application.properties" />

logback.xmlが機能するはずです。

35
Gary Russell

Spring Boot 1.3以降、logback-spring.xml構成にスプリングプロパティを取得するより良い方法があります。

これで、「springProperty」要素を追加できます。

<springProperty name="destination" source="my.loggger.extradest"/>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${destination}</file>
        ...
    </file>
</appender>

https://github.com/spring-projects/spring-boot/commit/055ace37f006120b0006956b03c7f358d5f3729f

編集:アンダースのおかげで

.........

53
Lasse L

上記で回答したように、<springProperty>要素を使用してスプリングブートプロパティにアクセスできますが、留意すべきことは、ログバック構成ファイルの名前はlogback-spring.xmlでなければならないということです。ファイルにlogback.xmlという名前を付けます(spring-boot 1.3.5.RELEASEを使用しています)

8
anders

上記のソリューションは、主にbootrap.properties。ただし、現在見つけたlogback configでリモートのSpring Config Serverのプロパティを使用する唯一の方法は、それらをプログラムで適用することです。

@Component
public class LoggerConfiguration implements ApplicationListener<EnvironmentChangeEvent> {

    @Autowired protected Environment environment;

    @Override
    public void onApplicationEvent(EnvironmentChangeEvent event) {
        // enviroment here has already loaded all properties and you may alter logback config programatically
        ch.qos.logback.classic.Logger rootLogger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
    }


}

ここ は、この方法で新しいアペンダーでログバックをカスタマイズする方法の良い例です。

1