概要
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">
compact
とeventEol
というパラメータをtrueで設定してあげます
すると改行されてきれいに見えていたJsonが1行ごとに改行されて出力されるようになります
ログ解析を目的としているならこのパラメータを付与してあげるのがいいと思います
最後に
いろいろ調べてやってみたのですがJSONLayoutのlog4j2.xmlのサンプルがなかったり、JavaのサンプルのコードがなかったりとWebに情報が少ないよういに感じました
まだ少ないだけなのかJavaでそもそもJson形式のログを吐くこと自体需要がないのか
はたまた、Java自体に需要がないのか・・・
まぁとりあえずJson形式のログが吐けるようになったのであとはtd-agentやlogstashでログを飛ばして可視化してみたいと思います
その辺の連携も紹介できればしたいと思います
0 件のコメント:
コメントを投稿