Q1:JDK1.4 ロギングAPI との違いは?

ログレベル

Log4j は6つのレベルが定義されていますが、JDK1.4 ロギングAPI では以下の7つが定義されています。INFO 以外はレベルの名称が Log4j と異なっています。

コーディング

Log4j と良く似ています。JDK1.4 ロギングAPI も Logger クラスを持っており、このクラスのメソッドによってログ出力を行います。Log4j と同じように Logger クラスのインスタンスを生成し、各レベルに応じたメソッドを呼び出す方法が基本になります。

private static Logger logger = Logger.getLogger("com.wombat.nose");
public void printLog() {
    logger.info("info message");
}

ただし、Log4j ではログ出力メソッドの第2引数に例外オブジェクトを渡すことができましたが、JDK1.4 ロギングAPI はそのような API を持っていないため、代わりにログレベルを指定する Logger#log() メソッドを呼び出します。

logger.log(Level.SEVERE, severe message, exception);

ハンドラ

JDK1.4 ロギングAPI では以下の5つのハンドラが用意されています。Log4j のように Syslog や SMTP ハンドラは用意されておらず、基本的なハンドラだけが提供されています。

ハンドラ 説明
StreamHandler 書式付きレコードを OutputStream に書き込む単純なハンドラ
ConsoleHandler 書式付きレコードを System.err に書き込む単純なハンドラ
FileHandler 書式付きレコードを 1 つのファイルまたは回転ログファイルのセットに書き込むハンドラ
SocketHandler 書式付きレコードをリモートの TCP ポートに書き込むハンドラ
MemoryHandler ログレコードをメモリにバッファリングするハンドラ

ファイル名パターン

JDK1.4 ロギングAPI では出力ファイル名に変換パターン記号を使うことができます。パターンという名前から勘違いしてしまいそうですが、出力レイアウトのパターンとは違います。以下は使用可能な変換パターン記号一覧です。

変換パターン記号 説明
"/" ローカルパス名の区切り文字
"%t" システムの一時ディレクトリ
"%h" user.home システムプロパティの値
"%g" ログのローテーションを識別する生成番号
"%u" 重複を解決する一意の番号
"%%" 単一のパーセント符号 % に変換

出力フォーマット

JDK1.4 ロギングAPI では Log4j のように設定ファイルでログ出力フォーマットを自由に設定することができません。 Log4j では PatternLayout と変換パターン記号を使って、設定ファイルだけで自由に出力内容をカスタマイズできましたが、JDK1.4 ロギングAPI で出力フォーマットを設定するには、そのフォーマット用のソースを作成する必要があります。

用意されているフォーマットは

の2種類です。前述のように出力内容は固定で SimpleFormatter ならば以下の項目が出力されます。ログレベルはローカライズされて表示されます。

出力項目 出力例
出力日時 2004/03/08 20:08:26
logger名 logtest.performance.JDKPerformanceTest
メソッド名 printLog
レベル 詳細レベル (低): DEBUG
メッセージ message

出力例:

2004/03/08 20:08:26 logtest.performance.JDKPerformanceTest printLog 
詳細レベル (低): DEBUG message

初期設定ファイル

JDK1.4 ロギングAPI ではプロパティファイルでロギングの設定を行います。以下はその設定例です。

############################################################
#       Global properties
############################################################


# "handlers" specifies a comma separated list of log Handler 
# classes.  These handlers will be installed during VM startup.
handlers = java.util.logging.ConsoleHandler
 
# Default global logging level.
.level= INFO
  
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.loggging.XMLFormatter
 
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

Log4j とJDK1.4ロギングAPI の比較

ざっと見て非常によく似ています。ですが、ハンドラの種類、出力フォーマット変更の柔軟性、ドキュメントの豊富さ等、Log4j のほうが機能的に優れているように思います。ただ、JDK1.4 ロギングAPI には外部ライブラリに依存しないというメリットがありますので、必要に応じて選択すればよいでしょう。どちらも選択できるならば個人的には Log4j をお勧めします。JDK1.4 ロギングAPI の機能で十分だとしても、将来細かな制御が必要になった場合に対応できない場合があるからです。

また、Log4j の設計者による Log4j とJDKロギングAPIの比較 (もちろん Log4j 陣営からの視点ですが)に詳細な比較があります。


トップページへ戻る