web-dev-qa-db-ja.com

log4j2.xmlでSpringブートアプリケーションのプロパティを使用する

私は春のブートに基づくWebアプリケーションに取り組んでおり、ロガーの実装としてlog4j2を使用したいと考えています。
log4j2-spring.xmlファイルで定義されたロギング設定ですべてが正常に機能します。

機能していないもの:スプリングブートの構成に使用されるapplication.ymlファイルで定義されたプロパティから解決する必要があるプロパティプレースホルダーをlog4j2-spring.xmlファイルで使用したいと思います。

これは可能ですか?はいの場合、どのように?

12
Ankit Gupta

プロパティプレースホルダーによる_log4j2-spring.xml_のプロパティの直接置換はnotが可能です。これは、_log4j2-spring.xml_がSpringの範囲外にあり、純粋に構成目的で使用されるためです。

ただし、概説されているように、プロパティ置換の_Log4j2_のすぐに使える機能を利用できます here

ステップ1-_log4j2-spring.xml_にプロパティ名とその変数を次のように指定します

_<Configuration status="warn">
    <Properties>
        <Property name="someProp">${bundle:test:someKey}</Property>
    </Properties> 
    <!--other configs -->
</Configuration>
_

ステップ2-ログ構成で上記で定義されたプロパティを使用します。ログファイル名のサフィックス

_<Appenders>
    <File name="file" fileName="/path/to/logs/app-${someProp}.log">
        <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %-40c{1.} - %m%n"/>
    </File>
</Appenders>
_

ステップ-プロパティ値を保持するbundleviz.properties file )を作成します。 test.properties

_# properties for log4j2
someKey=someValue
someKey1=someValue1
_

あなたの場合、このファイルには、log4j2設定で使用しようとするyamlの値が含まれます。これらのプロパティがアプリケーションでも使用されている場合、それらはyamlとバンドル( ieプロパティファイル)で複製されます。これは、Springがlog4j2構成にそれらを注入できない場合、許容できる妥協点です。 。

さらに情報が必要な場合は、コメントでお知らせください。

8

私は、Spring Boot YAMLプロパティをlog4j xml構成に挿入することで同様の問題に直面し、Spring Boot 1.5.X(そしておそらく2.0ではテストしていません)のソリューションを見つけました。プロパティのルックアップですが、確かに機能します。

アプリケーションに「dev」というプロファイルがあり、注入するいくつかのプロパティがあるとします。すると、application-dev.ymlは次のようになります。

property:
    toInject: someValue

Xml構成log4j2-spring-dev.xmlでは、次のように記述します。

<Properties>
    <property name="someProp">${sys:property.toInject}</property>
</Properties>

次に、この春のプロパティを何らかの方法でシステムプロパティに転送する必要があります。これは、アプリケーション環境が準備された後、ロギングシステムが初期化される前に行う必要があります。 Spring Bootには、ロギングシステム全体を初期化するリスナーLoggingApplicationListenerがあり、イベントApplicationEnvironmentPreparedEventによってトリガーされるので、LoggingApplicationListenerよりも優先順位が高いリスナーを作成してみましょう。

public class LoggingListener implements ApplicationListener, Ordered {

@Override
public int getOrder() {
    return LoggingApplicationListener.DEFAULT_ORDER - 1;
}

@Override
public void onApplicationEvent(ApplicationEvent event) {
    if (event instanceof ApplicationEnvironmentPreparedEvent) {
        ConfigurableEnvironment environment = ((ApplicationEnvironmentPreparedEvent) event).getEnvironment();
        List<String> activeProfiles = Arrays.asList(environment.getActiveProfiles());
        if (!activeProfiles.contains("dev")) {
            return;
        }

        String someProp = environment.getProperty("property.toInject")
        validateProperty(someProp);

        System.setProperty("property.toInject", someProp);
    }
}

次に、このリスナーをアプリケーションに登録します。

public static void main(String[] args) {
    SpringApplication application = new SpringApplication(MyApplication.class);
    application.addListeners(new LoggingListener());
    application.run(args);
}

以上です。 Spring Bootのプロパティは、log4j2構成ファイルに「挿入」する必要があります。このソリューションは、クラスパスプロパティと--spring.config.locationプロパティで機能します。 Spring Cloud Configなどの一部の外部構成システムでは機能しません。

それが役に立てば幸い

3
DG94