Lombok でできること確認します。( Logger )

2021年5月6日

この記事では Lombok の Logger 利用法について確認したいと思います。

ログとは

お仕事で「ログ」という言葉をよく耳にするし、重要性というのはよく知られているかと思います。

ITトレンドのIT用語集

ログとは、コンピュータの利用状況やデータ通信など履歴や情報の記録を取る事、またその記録を指す。

とあるように、開発したシステムが意図したとおり動作しているのか外部から管理する目的で利用されます。
これがないとシステムに不具合があった場合に「どの部分のどの関数」なのか探すのに苦労します。

また不正アクセス時にもどの部分の処理を突破されて侵入されたのか迅速に解析が難しくなります。

Javaでのログ

Javaでは古よりLog4jというライブラリが使用されてきました。
そこから 標準的なロガーが出張ってきたりそれをまとめようと救世主が出てきたり・・・
と混迷を極めていたようですがいまではSlf4jというJavaのロガー戦争が統治したようです。

こちらの記事が大変わかりやすく参考になります。
Javaのロギングライブラリの歴史と現状をふんわり把握する(初学者向け)

 

ということで Slf4jというライブラリを使用するのが一般的なようです。
さらにお仕事ではlogbackやlog4j2のものと組み合わせることが良いそうです。
参考: SLF4Jの仕組みと使用方法

時代が変わったなぁとしみじみ思います😑

Slf4j を使ってみる

まず普通に使ってみましょう。

Slf4jとlogbackをインストール

まずSlf4jのライブラリを用意してパスを通す必要があります。
また今回はSlf4jの相方としてlogbackを採用してみます。
こちらも用意してパスを通さないといけません。

STSでmavenプロジェクトなら楽々導入できます。
この環境で進めてきてよかった!
プロジェクト内のpom.xmlを開きdependencies要素内に目的のライブラリを追記するだけです。

具体的には以下のようになります。

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter</artifactId>
	</dependency>

	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<optional>true</optional>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
	<!-- ここから -->
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.30</version>
	</dependency>
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
		<version>1.2.3</version>
	</dependency>
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-core</artifactId>
		<version>1.2.3</version>
	</dependency>
	<!-- ここまでを追加! -->
</dependencies>

保存してみると警告が・・・

Duplicating・・・あれ?もしかしてすでに導入済み?
プロジェクト作成時に自動的に導入されたのかもしれません。
とにかく先ほど記述した部分は削除して次に進みます。

該当部分を元に戻して確認すると確かに、すでに導入されていました(笑

実装して出力

package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {
	// Slf4j + logback 
	private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);

	public static void main(String[] args) {

		log.info("メイン開始します!");
		
		SpringApplication.run(DemoApplication.class, args);

		// インスタンス化!
		HogeLombok v = new HogeLombok();

		System.out.println("v " + v);
		log.info("メイン終了します!");
	}
}

こんな感じで使用します。

 

いい感じですね!

 

Lombokを使ったら!

試してみた

Lombok で使う場合は @Slf4j を使用します。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import lombok.extern.slf4j.Slf4j;

@SpringBootApplication
@Slf4j
public class DemoApplication {
	// @Slf4jを使うとこの記述がいらない!!!
	//private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);

	public static void main(String[] args) {

		log.info("メイン開始します!");
		
		SpringApplication.run(DemoApplication.class, args);

		// インスタンス化!
		HogeLombok v = new HogeLombok();

		System.out.println("v " + v);
		log.info("メイン終了します!");
	}
}

 

logという変数を宣言しているわけでもないのに使用できます。
ここがLombokのすごいところですよね。
ただ、Lombokを知らない人が見たら「なんでlogという変数を使えるんだ???」と思ってしまいそうです。

 

確認してみた

先ほどと同じ結果になりましたね。

まとめ

Lombok の Logger について確認しました。
Javaのロガーは混迷した時代があり、いまSlf4jでまとまっている状態なんですね。
今回はこのことに驚いてしまいました。

今日はここまで!