2015年5月17日日曜日

log4j2 を使って Json 形式のログを出力してみた

概要

log4j2を使ってJson形式のログを1行ずつ出力してみました
Githubで昔公開したlog4j2のサンプルソースを使って解説します

環境

  • Windows7 64bit
  • Eclipse 4.4 Luna
  • Java 1.8.0_25
  • log4j2 2.3

各種インストールと設定

Githubで公開しているサンプルプロジェクトはMavenを使っているのでMavenも使えるようにしておいてください
Eclipseのm2eの組み込みのMavenでもOKです
サンプルプロジェクトを使う場合はgit cloneしてEclipseのEGitでプロジェクトをEclipseに読み込んでからインポートしてください
.projectファイルと.classpathファイルもコミットしているのでインポートすれば特に設定せずに使えると思います

もちろん自分で開発しているプロジェクトでもOKです

必要なライブラリのインストール

log4j2を使うためのライブラリをインストールします
また、Json形式のログを出力できるようにするためにJacksonを使います

pom.xmlのdepenciesタグ内に以下を追記します

<!-- for log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.3</version>
</dependency>
<!-- for log4j2 of JSONLayout -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-core</artifactId>
  <version>2.5.3</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.5.3</version>
</dependency>

これでlog4j2でJson形式のログを出力するためのライブラリのインストールは完了です
記載したら自動でビルドされると思いますが一旦プロジェクトをクリーンするといいと思います

log4j2.xml の編集

サンプルのプロジェクトだと「src/main/java/log4j2.xml」になります
今回は標準出力にJson形式のログを出力してみます
Json形式のログを出力するためにはJSONLayoutというAppenderを利用します
以下のような感じでlog4j2.xmlのappendersタグ内に記載します

<appenders>
  <Console name="Console" target="SYSTEM_OUT">
    <JSONLayout>
    </JSONLayout>
  </Console>
</appenders>

JSONLayoutは<patter>タブを使って出力形式を設定しません
設定すると「JSONLayoutでは<patter>タグは使えないよ」という感じのERRORが出ると思います
あとは上記のConsole Appenderを参照するloggersを追加してあげればOKです

Javaからの使い方

特にJsonLayoutだからと言って特別な使い方はありません
いつも通りロギング用のオブジェクトを生成してlog.debugとかを呼び出せばOKです

サンプルだと以下のような感じで使っています

package com.kakakikikeke.sample;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class Log4j2Sample {

    private static Logger log;

    public Log4j2Sample() {
        log = LogManager.getLogger(Log4j2Sample.this);
    }

    public static void main(String[] args) {
        new Log4j2Sample();
        log.error("This is error messages");
        log.trace("下記以降はlog4j2.xmlファイルがクラスパスに通っていないと表示されません");
        log.trace("This is trace messages");
    }

}

出力されるログのサンプル

これで準備は整いました
サンプルのプロジェクトを使っている場合はcom.kakakikikeke.sample.Log4j2Sample.javaを右クリックしてRun As -> Java ApplicationとすればOKです

出力のサンプルは以下のとおりです

{
  "timeMillis" : 1431667419708,
  "thread" : "main",
  "level" : "ERROR",
  "loggerName" : "com.kakakikikeke.sample.Log4j2Sample",
  "message" : "This is error messages",
  "endOfBatch" : false,
  "loggerFqcn" : "org.apache.logging.log4j.spi.AbstractLogger"
}

こんな感じでlog.errorとかでロギングした行ごとにJsonが出力されます
自身でしていしたログメッセージはmessageフィールドとして出力されるようです

Tips

これでとりあえずJson形式のログを出力することはできました
ですがこのままだとログを1行ずつ処理するときに非常に面倒です
なので、1Jsonログを1行で出力するための設定を追加します

<JSONLayout compact="true" eventEol="true">

compacteventEolというパラメータをtrueで設定してあげます
すると改行されてきれいに見えていたJsonが1行ごとに改行されて出力されるようになります
ログ解析を目的としているならこのパラメータを付与してあげるのがいいと思います

最後に

いろいろ調べてやってみたのですがJSONLayoutのlog4j2.xmlのサンプルがなかったり、JavaのサンプルのコードがなかったりとWebに情報が少ないよういに感じました
まだ少ないだけなのかJavaでそもそもJson形式のログを吐くこと自体需要がないのか
はたまた、Java自体に需要がないのか・・・

まぁとりあえずJson形式のログが吐けるようになったのであとはtd-agentやlogstashでログを飛ばして可視化してみたいと思います
その辺の連携も紹介できればしたいと思います

参考サイト

0 件のコメント:

コメントを投稿