スプリング ブートを使用すると、次のようにファイルを2.1.1.RELEASE
指定することで、ログを JSON としてフォーマットすることができます。logback-spring.xml
<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"
}
なんで?
ログが JSON 形式である場合により有利に動作するように見えるlogz.ioを試しています。一部の荷送人は、Java スタック トレースで見られるように複数行のログに苦労し、JSON でフォーマットすると、 and などのフィールドを自動的に解析level
できmessage
ますMDC データは自動的に取得されます。
docker イメージや、JSON 形式のログ メッセージを使用せずに rsyslog を使用するなど、ログを logzio に送信するいくつかの方法については、それほど素晴らしい経験ではありませんでした。
このアプローチの問題点
コンソールの追加では問題なく動作しますが、スプリング ブートは , , のようlogging.file=test.log
にlogging.level.com.example=WARN
提供しますlogging.pattern.console
。実際に、管理された構成をインポートして、そこからfile-appender.xml`spring-boot-2.1.1.RELEASE.jar!/org/springframework/boot/logging/logback/base.xml
をインポートできます。console-appender.xml and
コンソールアペンダーの例
<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 つのファイルの内容をインポートするのではなく、コピーしてカスタム構成に貼り付けることができます。次に、カスタマイズしたいものをオーバーライドすることがあります。
ただし、春が進化し、機能を追加する可能性のある新しいリリースが作成されると、新しいファイルをコピーして貼り付け、変更を加えてテストすることを永遠に強制されます。
私ができるより良い方法はありますか:
- アペンダーを完全に再定義するのではなく、アペンダーに追加の変更を加えるだけです。たとえば、構成を春から保持し、それらのアペンダーで使用される独自のエンコーダーまたはレイアウトを提供します。
- 構成なしで完全にプロパティを介してSpringをJSONログに構成します-私はこれを疑います:S
脚注: logzio はインポートできる依存関係を提供しますが、ログ プロバイダーをコードに直接結合するという考えは嫌いです。サーボがたまたま標準出力またはファイルに JSON ログを生成した場合、どのプロバイダーでもそれらを処理して特定の宛先に出荷するのは簡単だと思います。