ログとは、英訳の1つに「の記録を取る」の通り、プログラム言語の処理の実行記録や、例外発生時の例外の記録を意味します。
ログの正しい利用方法と、適切なログの記述は、システムの規模が大きく成ればなるほどとても大切な事です。
JavaAPIにjava.util.loggingパッケージが実装されたのはJdk1.4からリリースされました。
ログには、ライブラリの系統が多々ありますが基本的に以下の機能が満たされています。
Javaのログ機能に関して、JavaAPIの世界で閉じられていれば、どれだけエンジニアにとって幸せな事でしょうか。
残念ながら、Javaを取り巻くログのライブリ及びJavaAPIのログ機能の関係性は限りなくカオスな状態です。
ログ機能は、インターフェイスと実装クラスか構成されます。
どのライブラリがインターフェイスで、実装クラスかをはじめに理解しておく必要があります。
ライブラリ名 | パッケージ | 種別 | トレンド | 説明 |
---|---|---|---|---|
commons- logging |
org.apache. commons.logging |
インターフェイス | 2002-2012 | 元祖ログのインターフェイス。 実装クラスlog4j 1.x系との組み合わせが最初のトレンド |
SLF4J | org.slf4j | インターフェイス アダプタークラス |
2012-2017 | 作者「Ceki Gülcü」がログ実装ライブラリを取り纏める SLF4Jインターフェイスと各種アダプター(commons-logging,Log4J 1.x系) と実装クラスの「logback」ライブラリをリリースする。 トレンドとして「SLF4J + logback」をデファクトスタンダードにした |
Log4J 1.x系 | org.apache.log4j | 実装クラス | 2002-2012 | commons-loggingと組み合わせて 2010年前後までログの最初のトレンドになる 2012年からLog4J 2.x系に移行 |
JavaAPI-logging | java.util.logging | 実装クラス | 不明 | ここまで、JavaAPIに組み込まれているのにも関わらず エンジニアから利用頻度が低いのは、commons-loggingとLog4j 1.x系 がログのデファクトスタンダードになってから、リリースされたためです。 |
logback | ch.qos.logback | 実装クラス | 2012-2017 | SLF4Jインターフェイスライブラリの デフォルトの実装クラスがlogbackだったため 2012年頃からデファクトスタンダードになる。 log4jの原作者「Ceki Gülcü」がlog4j 1.x系の後継として製造 |
Log4J 2.x | org.apache. logging.log4j |
実装クラス | 不明 | これは、「logback」との対抗するライブラリ ただし、インターフェイスはSLF4Jと組み合わせるパターン 2017年時点では、logback vs Log4J2.x系か。 Log4j1.x系自体が最初のトレンドで使いこなせる人が多いので 「SLF4J + Log4J 2.x系」でトレンドになるのでは |
私のログライブラリの選定基準は以下になります。
重要な事は、ログの系統を開発するシステムでできるだけ多系統にしない事です。
システム規模が大きくなればなるほど共通チームによるログのポリシーと実装ルールは、とても重要になります。
次の頁では、java.util.loggingのみでログを表現してみます。
ログ機能に関しては、製造する会社やエンジニアが独自のログ機能を用いたクラスを製造する事はナンセンスです。
ログ機能は、多系統のいずれか必ずやりたい事が設定ファイルの切替で実現可能です。
そのため、ログ機能に関しては、クラスを作るというよりは、ライブラリの機能を正しく把握して、使う事に集中することです。