JSONでログ出力を取得する
1. 前書き
現在、ほとんどのJavaロギングライブラリには、ログをフォーマットするためのさまざまなレイアウトオプションがあり、各プロジェクトのニーズに正確に適合しています。
この簡単な記事では、ログエントリをJSONとしてフォーマットして出力します。 最も広く使用されている2つのロギングライブラリLog4j2とLogbackに対してこれを行う方法を説明します。
どちらも、ログをJSON形式で表すために内部的にJacksonを使用します。
これらのライブラリの概要については、introduction to Java Logging articleをご覧ください。
2. Log4j2
Log4j2は、Javaで最も人気のあるロギングライブラリであるLog4Jの直接の後継です。
これはJavaプロジェクトの新しい標準であるため、JSONを出力するように構成する方法を示します。
2.1. 依存関係
まず、pom.xmlファイルに次の依存関係を含める必要があります。
org.apache.logging.log4j
log4j-core
2.10.0
com.fasterxml.jackson.core
jackson-databind
2.9.3
以前の依存関係の最新バージョンは、Maven Centralにあります:log4j-api、log4j-core、jackson-databind.
2.2. 設定
次に、log4j2.xmlファイルで、JsonLayoutを使用する新しいAppenderと、このAppenderを使用する新しい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の後継と見なすことができます。 同じ開発者によって書かれ、前任者よりも効率的で高速であると主張しています。
それでは、JSON形式でログの出力を取得するように構成する方法を見てみましょう。
3.1. 依存関係
pom.xmlに次の依存関係を含めましょう。
ch.qos.logback
logback-classic
1.1.7
ch.qos.logback.contrib
logback-json-classic
0.1.5
ch.qos.logback.contrib
logback-jackson
0.1.5
com.fasterxml.jackson.core
jackson-databind
2.9.3
これらの依存関係の最新バージョンについては、ここで確認できます:logback-classic、logback-json-classic、logback-jackson、jackson-databind
3.2. 設定
まず、JsonLayoutとJacksonJsonFormatter.を使用する新しいappenderをlogback.xmlに作成します。
その後、このappenderを使用する新しいloggerを作成できます。
true
yyyy-MM-dd' 'HH:mm:ss.SSS
ご覧のとおり、パラメーター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"
}