Inspiration
Javaアプリのログからデータ分析を行うことはできるかが気になり、まずログを収集する方法について調べました。
他のライブラリも同様にできますが、初めに目についたものがLog4jだったのでできるかを検証してます。
結果はできたものの、これによってアプリにさらなる外部ライブラリ依存が発生します。
環境
- JDK 8 以上
- kafka-client-3.2.0
- log4j-api-2.17.2
- log4j-core-2.17.2
- log4j-iostream-2.17.2
- log4j-slf4j-impl-2.17.2
- log4j-web-2.17.2
- lz4-java-1.8.0
- slf4j-api-1.7.36
- snappy-java-1.1.8.4
- tjconsole-1.7-all
- zstd-jni-1.5.2-1
実装
下記のソースコードを使います。
コードについて出力するだけのロジックになります。
package com.tutorial;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
private static final Logger logger = LogManager.getLogger(Main.class);
public static void main(String[] args) {
System.out.println("Initial RUnnn");
logger.info("test runun!");
}
}
log4jの設定XMLは下記になります。
xml log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<Kafka name="Kafka" topic="quickstart-events">
<PatternLayout pattern="%date %message"/>
<Property name="bootstrap.servers">localhost:9092</Property>
</Kafka>
</appenders>
<loggers>
<logger name="com.tutorial.Main" level="trace">
<appender-ref ref="Console"/>
<appender-ref ref="Kafka"/>
</logger>
<root level="error">
<appender-ref ref="Console"/>
</root>
</loggers>
</configuration>
動作確認
-
ターゲットイベントを確認するためのConsumerを起動します。
-
Javaのアプリを実行します。
終わり
Log4jのAppend機能を使うことで追加で必要になったライブラリですが、kafka-client, slf4jなど必要になります。log4jのライブライだと、JDK6から使えるものですが、kafka-clientの最低要求JDKバージョンが8になるのでJDK6だと制約を受けることになります。
アプリにデータ集計のために追加でソースコードを記載しなくても済む方法になるので既存の資産を修正したくない場合には有効な方法になるかと思います。ただ、Kafkaを使っていますので追加で管理する箇所が発生する点とアプリログをKafkaに送ることで想定外のエラーが発生する可能性があります。
他のログライブラリだと、Logbackからもできそうですので、好みで選んでいただければと思います。