web-dev-qa-db-ja.com

アクティブなSpringプロファイルをログバックに挿入する方法

SpringBootプロジェクトを使用しています。

環境:

ch.qos.logback:logback-core:jar:1.1.5
ch.qos.logback:logback-classic:jar:1.1.5
org.springframework.boot:spring-boot-starter-logging:jar:1.3.3.RELEASE

私のプロジェクトでは、application.yml(application-dev.ymlおよびapplication-production.yml)でプロパティを使用しています

Logback Spring拡張機能はSpringの前に開始されるため、spring.profiles.activeをlogback.xmlファイルに挿入できません。

これは私のlogback.xmlファイルのより単純なバージョンです:

<configuration scan="true">

   <property name="LOG_PATH" value="/var/log/" />
   <property name="APP_NAME" value="xyz" />
   <property name="PROFILE" value="-${spring.profiles.active}" />
   <property name="CHARSET" value="utf-8" />
   <property name="PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />

   <appender name="APP-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file>
      <encoder>
         <charset>${CHARSET}</charset>
         <Pattern>${PATTERN}</Pattern>
      </encoder>
   </appender>

   <logger name="a.b.c" level="INFO">
      <appender-ref ref="APP-FILE" />
   </logger>

   <root level="INFO">
      <appender-ref ref="APP-FILE"/>
   </root>

私が探しているプロファイルは、プロパティspring.profiles.activeです。

私の目標は、ディレクトリにログファイルを作成することです/ var/logファイルxyz-devまたはxyz-productionですが、取得しますxyz-spring.profiles.active_IS_UNDEFINED.logもちろんではありません。

アプローチ:

1-次のようなコンポーネントを使用する:

@Component
public class InitializationService implements ApplicationListener<ContextRefreshedEvent> {

// inject spring profile active into logback.xml

}

ログバックSpring拡張機能はSpringBootアプリケーションの前に開始されるため、もちろん機能していません。

2-このようにlogback.xmlのプロパティを使用する

<file>${LOG_PATH}${APP_NAME}${PROFILE}.log</file>

結果はxyz-spring.profiles.active_IS_UNDEFINED.logです。

9
Leonel

これは答えるのに少し遅れていますが、「logback.xml」ファイルの名前を「logback-spring.xml」に変更することでSpringプロファイルを正常にログに記録し、この(はるかに)簡略化されたバージョンのようにプロファイルにアクセスしました

<springProperty scope="context" name="ACTIVE_PROFILE" source="spring.profiles.active"/>

<appender name="GRAYLOG" class="com.github.pukkaone.gelf.logback.GelfAppender">

    <additionalField>environment=${ACTIVE_PROFILE}</additionalField>

</appender>

<root level="WARN">
    <appender-ref ref="GRAYLOG" />
</root>

「logback-spring.xml」がプロファイル情報を取得できるようです。

特定の ドキュメントはここにあります

14
scudsucker
  • Spring Bootを使用しているので、logging.file=blah.logを定義できます。 公式ドキュメント を参照してください。
  • または、Vanilla Logbackを使用して、システム変数-DLOG_FILE=blah.logを渡すこともできます。

プロファイルを使用すべきでない理由:

あなたがやろうとしているのは、春のプロファイルが作成された目的ではありません。これらは、起動時に動作をアクティブ化/非アクティブ化するためにBeanのオン/オフを切り替えるために必要です。 プロファイルは、テストするものと本番環境で機能するものが異なるため、一般的には推奨されません(ただし、他に選択肢がない場合もあります)。 元の発表警告セクションを参照してください。

プロファイルの使用に関するもう1つの問題は、複数のプロファイルを同時にアクティブ化できることです。プロファイルは、無関係な小さなパーツのオン/オフを切り替えるために作成されました。例えば。 spring.profiles.active=cache-off,perf-monitoring-onまたはそのようなもの。

それでも、プロファイルを定義して、そのプロファイル内にlogging.file=prod.logプロパティを設定できます。それはまだ非常に悪いことであり、プロファイルの使用方法ではありませんが、それはより良いことです。

これが私のプロジェクトのために私がしたことです。 logback.xmlの内部

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

<property resource="application.properties"/>

次に、application.propertiesファイルで定義されているプロパティを使用できます。 ${MY-PROPERTY} application.propertiesに、ログファイルの名前のプロパティがあります。

yamlファイルはログバックの初期化後に解釈されるため、これはapplication.yml => YAMLプロパティファイルでは機能しません。

3
David G.