SLF4Jを使ってみる!

今の今までログ出力をしたことがなかったわけではないのですが、その仕組について調査する機会がありませんでした。なので、このあたりでログ出力の代表的なライブラリであるSLF4Jについて調べてみました。

www.slf4j.org

SLF4Jとは?

SLF4Jというのは略語で、もともとは Simple Logging Facade for Java になります。ライブラリは「for」を「4」に置き換えて表現することが多いのですが、SLF4Jもその表現を使っているみたいですね。

ここで Facade という言葉が出てきています。Facade という言葉を直接訳すと正面とか、見かけとなりますが、ここではGoFデザインパターンで出てくる Facade を指していると思われます。

Facade とは何らかの複雑な実装をクライアントコードから隠蔽することでモジュールやシステム間の結合度を下げるパターンです。これをロギングという観点で見るとログの仕組みをクライアントコードから隠蔽するということになります。

SLF4Jの公式サイトには以下のような説明文があり、SLF4J自体は複雑な実装を保持するのではなく、他のロギングライブラリへの入り口を提供するものとなります。

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.

SLF4Jと他フレームワークバインディング

SLF4J自体はFacadeの役割を持つだけなので、ログを出力するには他のライブラリをSLF4Jにバインディング(紐付ける)しなければいけません。紐付けるには提供されているモジュールをクラスパスに追加するだけで良いみたいです。執筆時点では以下のライブラリがバインディング対象として提供されています。

slf4j-simple という単純なバインディング対象が用意されているのでそれをつかって Hello, World を動かしてみました。

出力は以下になります。

[main] INFO com.example.slf4j.GettingStartedSLF4J - Hello, SLF4J!

使い方は LoggerFactory から Logger を取得し、ログレベルに合わせたメソッドを呼び出すのが基本です。Logger クラスがクライアントコードのエントリポイントになります。

いろんな出力方式

状況に合わせていろいろな出力の形式を取ることができるようになっています。

gist.github.com

{}を使用した出力内容の組み合わせはパフォーマンスとしても良いそうなので、自分で出力文字列を生成するよりこちらを使用したほうがいいみたいです。詳しくは以下のQAに書いてあります。