ログとは

ログとは、英訳の1つに「の記録を取る」の通り、プログラム言語の処理の実行記録や、例外発生時の例外の記録を意味します。
ログの正しい利用方法と、適切なログの記述は、システムの規模が大きく成ればなるほどとても大切な事です。

JavaAPIにjava.util.loggingパッケージが実装されたのはJdk1.4からリリースされました。

ログ標準機能

ログには、ライブラリの系統が多々ありますが基本的に以下の機能が満たされています。

  1. 標準出力への出力
  2. 標準エラー出力への出力
  3. 指定ファイルへの出力
  4. ログレベル(致命的、例外、警告、情報、デバックなど)による出力可否の決定
  5. パッケージ階層によるログの切り分け
  6. 設定ファイルによる機能設定
  7. 設定ファイルによる出力フォーマットの切替

Javaのログライブラリ

ログライブラリの歴史

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のログライブラリ選定方法

私のログライブラリの選定基準は以下になります。

  1. 過去資産の保守性
    過去資産からの拡張及び改修の場合には、過去のライブラリをそのまま利用する。
    ただし、ログを統一する予算が計上されていた場合には、新しい組み合わせに統一する。
  2. 主な観点
    新規開発などで過去の資産を気にする必要がなければ、以下の観点で考察する
    • Webアプリケーションサーバのログライブラリ
    • フレームワークのログライブラリ
    • ライブラリのログライブラリ
    • 安定性
    • 将来性
    • 教育コスト
    • 保守性

重要な事は、ログの系統を開発するシステムでできるだけ多系統にしない事です。
システム規模が大きくなればなるほど共通チームによるログのポリシーと実装ルールは、とても重要になります。

次の頁では、java.util.loggingのみでログを表現してみます。

作るより使い方

ログ機能に関しては、製造する会社やエンジニアが独自のログ機能を用いたクラスを製造する事はナンセンスです。
ログ機能は、多系統のいずれか必ずやりたい事が設定ファイルの切替で実現可能です。
そのため、ログ機能に関しては、クラスを作るというよりは、ライブラリの機能を正しく把握して、使う事に集中することです。