web-dev-qa-db-ja.com

ログバックでJSON形式のログにSpring Bootを取得するための推奨される方法はありますか

スプリングブート2.1.1.RELEASEを使用すると、次のようにlogback-spring.xmlファイルを提供することにより、ログを一見JSONとしてフォーマットできます。

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
            <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
            <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
            <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                <prettyPrint>true</prettyPrint>
            </jsonFormatter>
        </layout>
    </encoder>
</appender>

<root level="INFO">
    <appender-ref ref="stdout" />
</root>

pom.xmlに追加

<dependency>
            <groupId>ch.qos.logback.contrib</groupId>
            <artifactId>logback-json-classic</artifactId>
            <version>0.1.5</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback.contrib</groupId>
            <artifactId>logback-jackson</artifactId>
            <version>0.1.5</version>
        </dependency>

確かに次のようなメッセージにつながります:

{
  "timestamp" : "2018-12-11T18:20:25.641Z",
  "level" : "INFO",
  "thread" : "main",
  "logger" : "com.netflix.config.sources.URLConfigurationSource",
  "message" : "To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.",
  "context" : "default"
}

どうして?

私は試行錯誤しています logz.io これは、ログがJSON形式である場合に動作が向上するようです。一部の荷主は、JavaスタックトレースやJSONで形式設定している場合に見られるような複数行ログに苦労していますlevelmessageなどのフィールドを自動的に解析できます。MDCデータがある場合は、それを自動的に取得します。

Dockerイメージや、JSON形式のログメッセージを使用せずにrsyslogを使用するなど、logzioにログを送信するいくつかの方法で、あまりよくない経験がありました。

このアプローチの問題

コンソールの追加では問題なく動作しますが、Spring Bootはlogging.file=test.loglogging.level.com.example=WARNlogging.pattern.consoleなどを提供します。確かにspring-boot-2.1.1.RELEASE.jar!/org/springframework/boot/logging/logback/base.xmlから管理された構成をインポートできます。これにより、console-appender.xml andfile-appender.xml`がインポートされます。

Console-appenderの例

<included>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
</included>

ファイルアペンダーの例

<included>
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <file>${LOG_FILE}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
            <maxHistory>${LOG_FILE_MAX_HISTORY:-0}</maxHistory>
        </rollingPolicy>
    </appender>
</included>

これら2つは、プロパティのスプリング構成をサポートするために必要なものですが、必要なエンコーダー/レイアウトは含まれていません。

最初のテストでは、アペンダーに同じ名前を付けてレイアウトを提供することは簡単ではないようです。例えば:

<configuration>

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

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
                <timestampFormat>yyyy-MM-dd'T'HH:mm:ss.SSSX</timestampFormat>
                <timestampFormatTimezoneId>Etc/UTC</timestampFormatTimezoneId>
                <jsonFormatter class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
                    <prettyPrint>true</prettyPrint>
                </jsonFormatter>
            </layout>
        </encoder>
    </appender>



    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

メッセージはJSON形式とプレーンテキスト形式の両方でログに記録されます。

実際、これら3つのファイルのコンテンツをインポートするのではなく、コピーしてカスタム構成に貼り付けるだけで済みます。次に、カスタマイズしたいものを上書きします。

しかし、春が進化し、機能を追加する可能性のある新しいリリースが作成されると、私は永遠に自分を追いかけ、新しいファイルをコピーして貼り付け、変更を加えてテストすることを強いられます。

私ができるより良い方法はありますか:

  • 完全に再定義するのではなく、アペンダーに追加の変更を加えるだけです。設定を春から維持しますが、これらのアペンダーが使用する独自のエンコーダーまたはレイアウトを提供します。
  • 設定なしで完全にプロパティを介してJSONログにSpringを設定します-私はこれを疑います:S

脚注:logzioが提供する 依存関係 インポートは可能ですが、ロギングプロバイダーをコードに直接結合するという考えは嫌いです。サーボが偶然に標準出力またはファイルにJSONログを生成する場合、プロバイダーがそれらを処理し、それらをある宛先に出荷するのは簡単だと思います。

7
David

依存関係は使用していません。単純に、application.ymlでそれを行うだけです。このソリューションは、複数行のログの問題も解決します。

logging:
  pattern:
    console: "{\"time\": \"%d\", \"level\": \"%p\", \"correlation-id\": \"%X{X-Correlation-Id}\", \"source\": \"%logger{63}:%L\", \"message\": \"%replace(%m%wEx{6}){'[\r\n]+', '\\n'}%nopex\"}%n"
2

ここから4つのファイルのうち3つを変更して貼り付けをコピーする必要があるようです https://github.com/spring-projects/spring-boot/tree/v2.1.1.RELEASE/spring-boot-project/ spring-boot/src/main/resources/org/springframework/boot/logging/logback を構成に追加します。

良いニュースは、貼り付けをコピーする必要がないことです https://github.com/spring-projects/spring-boot/blob/v2.1.1.RELEASE/spring-boot-project/spring-boot /src/main/resources/org/springframework/boot/logging/logback/defaults.xml

そのように含めることができます<include resource="org/springframework/boot/logging/logback/default.xml"/>

これにより、コピーして貼り付けることなく、Springのデフォルト設定の一部が得られます

0
JacobSTL