JSONでログ出力を取得する

JSONでログ出力を取得する

1. 前書き

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

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

どちらも、ログを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-apilog4j-corejackson-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-classiclogback-json-classiclogback-jacksonjackson-databind

3.2. 設定

まず、JsonLayoutJacksonJsonFormatter.を使用する新しいappenderlogback.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"
}

4. 結論

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

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