1. 序章

今日のほとんどのJavaロギングライブラリは、各プロジェクトのニーズに正確に適合するように、ログをフォーマットするためのさまざまなレイアウトオプションを提供しています。

このクイック記事では、ログエントリをJSONとしてフォーマットして出力します。 最も広く使用されている2つのロギングライブラリLog4j2Logbackに対してこれを行う方法を説明します。

どちらも、JSON形式でログを表すために内部的にJacksonを使用します。

これらのライブラリの概要については、Javaロギングの概要の記事をご覧ください。

2. Log4j2

Log4j2 は、Javaで最も人気のあるロギングライブラリであるLog4Jの直接の後継です。

Javaプロジェクトの新しい標準であるため、JSONを出力するように構成する方法を示します。

2.1. 依存関係

まず、pom。xmlファイルに次の依存関係を含める必要があります。

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.10.0</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.13.0</version>
    </dependency>
    
</dependencies>

以前の依存関係の最新バージョンは、Maven Centralにあります: log4j-api log4j-core jackson-databind。

2.2. 構成

次に、log4j2。xmlファイルで、JsonLayoutを使用する新しいAppenderと、これを使用する新しいLoggerを作成できます[ X147X]アペンダー:

<Appenders>
    <Console name="ConsoleJSONAppender" target="SYSTEM_OUT">
        <JsonLayout complete="false" compact="false">
            <KeyValuePair key="myCustomField" value="myCustomValue" />
        </JsonLayout>
    </Console>
</Appenders>

<Logger name="CONSOLE_JSON_APPENDER" level="TRACE" additivity="false">
    <AppenderRef ref="ConsoleJSONAppender" />
</Logger>

設定例でわかるように、 KeyValuePair を使用して独自の値をログに追加することができます。これは、ログコンテキストへのルックアウトもサポートします。

compactパラメーターをfalseに設定すると、出力のサイズが大きくなりますが、人間が読める形式になります。

2.3. Log4j2の使用

このコードでは、新しいJSONロガーをインスタンス化し、新しいデバッグレベルのトレースを作成できます。

Logger logger = LogManager.getLogger("CONSOLE_JSON_APPENDER");
logger.debug("Debug message");

前のコードのデバッグ出力メッセージは次のようになります。

{
  "timeMillis" : 1513290111664,
  "thread" : "main",
  "level" : "DEBUG",
  "loggerName" : "CONSOLE_JSON_APPENDER",
  "message" : "My debug message",
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger",
  "threadId" : 1,
  "threadPriority" : 5,
  "myCustomField" : "myCustomValue"
}

3. ログバック

Logback は、Log4Jのもう1つの後継と見なすことができます。 それは同じ開発者によって書かれ、前任者よりも効率的で高速であると主張しています。

それでは、JSON形式でログの出力を取得するように構成する方法を見てみましょう。

3.1. 依存関係

pom.xmlに次の依存関係を含めましょう。

<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.6</version>
    </dependency>

    <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>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
    </dependency>
</dependencies>

これらの依存関係の最新バージョンについては、ここで確認できます: logback-classic logback-json-classic logback-jackson jackson-databind

3.2. 構成

まず、JsonLayoutJacksonJsonFormatter。を使用する新しいappenderlogback.xmlに作成します。

その後、このappenderを使用する新しいloggerを作成できます。

<appender name="json" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.contrib.json.classic.JsonLayout">
        <jsonFormatter
            class="ch.qos.logback.contrib.jackson.JacksonJsonFormatter">
            <prettyPrint>true</prettyPrint>
        </jsonFormatter>
        <timestampFormat>yyyy-MM-dd' 'HH:mm:ss.SSS</timestampFormat>
    </layout>
</appender>

<logger name="jsonLogger" level="TRACE">
    <appender-ref ref="json" />
</logger>

ご覧のとおり、パラメータprettyPrint は、人間が読める形式のJSONを取得するために有効になっています。

3.3. ログバックの使用

コードでロガーをインスタンス化し、デバッグメッセージをログに記録しましょう。

Logger logger = LoggerFactory.getLogger("jsonLogger");
logger.debug("Debug message");

これにより、次の出力が得られます。

{
  "timestamp" : "2017-12-14 23:36:22.305",
  "level" : "DEBUG",
  "thread" : "main",
  "logger" : "jsonLogger",
  "message" : "Debug log message",
  "context" : "default"
}

4. 結論

ここでは、Log4j2とLogbackをJSON出力形式で簡単に構成する方法を説明しました。 解析のすべての複雑さをロギングライブラリに委任したため、既存のロガー呼び出しを変更する必要はありません。

いつものように、この記事のコードはGitHub herehereで入手できます。