@634

ロギングAPIの使用(java.util.logging)

Advertisement

ロギングAPI

J2SE1.3までのJDKにはロギングコンポーネントが付属していなかったため、プログラマが実装、Jakarta Log4jの利用、System.out.printlnでの出力などの手段でロギングやデバッグを行っていた。J2SE1.4からはjava.util.loggingパッケージが標準で追加された。このクラスを利用すると簡単にロギングを実現することができる。

簡易出力

java.util.logging.Loggerクラスには従来のSystem.out.printlnでの標準出力メソッドを置き換えるためにLogger.globalが用意されている。

サンプルコード
import java.util.logging.*;

public class SimpleOutput {
    public static void main(String[] args) {
        Logger.global.finest("FINEST");
        Logger.global.finer("FINER");
        Logger.global.fine("FINE");
        Logger.global.config("CONFIG");
        Logger.global.info("INFO");
        Logger.global.warning("WARNING");
        Logger.global.severe("SEVERE");
    }
}
実行結果
2004/06/11 19:34:37 mytest.logger.SimpleOutput main
情報: INFO
2004/06/11 19:34:38 mytest.logger.SimpleOutput main
警告: WARNING
2004/06/11 19:34:38 mytest.logger.SimpleOutput main
致命的: SEVERE
上記のサンプルコードで使用しているfinest, finer, fine, config, info, warning, severeメソッドはすべてログ出力のためのメソッド。すべてのログメッセージが出力されていない理由は後述する。

ログレベル

ログ出力にはレベル(カテゴリ)が存在する。コード中のログ出力部分でレベルを設定しておき、プログラム実行時にどのレベルまでのログを出力するのかを指定することができる。たとえば開発時と運用時でログ出力レベルを変更することにより、余計なログの出力を抑えることが可能となる。
ログレベル名対応メソッド
FINESTfinest
FINERfiner
FINEfine
CONFIGconfig
INFOinfo
WARNINGwarning
SEVEREsevere
前述のglobal出力のデフォルトログレベルはINFOとなっているため、INFOよりも上のレベル(info, warning, severe)のみが出力される。

globalログレベルの定義

globalを使用したログ出力の定義はjdkをインストールしたフォルダ内の/jre/lib/logging.propertiesファイルに指定されている。

一部抜粋
# Default global logging level.
# This specifies which kinds of events are logged across
# all loggers.  For any given facility this global level
# can be overriden by a facility specific level
# Note that the ConsoleHandler also has a separate level
# setting to limit messages printed to the console.
.level= INFO
この.level=INFOという記述がログレベルの指定である。

実験
.level= WARNING
実行結果
2004/06/11 19:34:38 mytest.logger.SimpleOutput main
警告: WARNING
2004/06/11 19:34:38 mytest.logger.SimpleOutput main
致命的: SEVERE
ログレベルにWARNINGを指定したことによってWARNINGより高いレベルのログのみ出力されるようになった。

Loggerクラスを使用したログ出力

前述した簡易ログ出力(Logger.global)は、あくまでも簡易的なログ出力であり、本格的なログ出力やファイル出力に対応させるため にはLoggerオブジェクトを使用してロギングを行う。

サンプルコード
import java.util.logging.*;

public class UseLogger {
    public static void main(String[] args) {
        // Loggerオブジェクトの作成
        Logger logger = Logger.getLogger("Sample");

        // ログ出力
        logger.info("ログ出力");
    }
}
Loggerオブジェクトを取得するためにはLoggerクラスに定義されているファクトリメソッドを使用する。その際、Loggerオブジェクトを識別するための文字列を引数に設定する。

ログレベルの変更

Loggingクラスを使用したログ出力でのログレベルの変更はsetLevelメソッドで行い、引数にはjava.util.logging.Levelクラスに定義されている定数を使用する。

Levelクラスに定義さている定数一覧
Level.FINEST
Level.FINER
Level.FINE
Level.CONFIG
Level.INFO
Level.WARNING
Level.SEVERE
Level.ALL すべてのレベル
Level.OFF ロギングしない

サンプルコード
import java.util.logging.*;

public class UseLogger {
    public static void main(String[] args) {
        // Loggerオブジェクトの作成
        Logger logger = Logger.getLogger("Sample");

        // Logレベルの設定
        logger.setLevel(Level.ALL);
        //logger.setLevel(Level.FINEST);
        //logger.setLevel(Level.FINER);
        //logger.setLevel(Level.FINE);
        //logger.setLevel(Level.CONFIG);
        //logger.setLevel(Level.INFO);
        //logger.setLevel(Level.WARNING);
        //logger.setLevel(Level.SEVERE);
        //logger.setLevel(Level.OFF);

        // ログ出力
        logger.info("ログ出力");
    }
}

ログファイル出力

ログファイルの出力にはjava.util.logging.FileHandlerを使用する

FileHandlerのコンストラクタは数種類存在するが、そのうちで基本的なものを紹介。
FileHandler(ファイルパス, ファイルサイズ, ファイル数)
ファイルパス:ログファイルを出力するパスを指定する。特殊文字も規程されている。
特殊文字一覧(APIドキュメントより引用)
/ローカルパス名の区切り文字
%tシステムの一時ディレクトリ
%huser.home システムプロパティの値
%gログのローテーションを識別する生成番号
%u重複を解決する一意の番号
%%単一のパーセント符号 % に変換
c:\logfile.log
%t/logfile.log
%h/logfile%g.log

ファイルサイズ:ログファイルの最大サイズを指定する

ファイル数:ログファイル数を1以上の正数で指定する。2以上を指定するとログファイルは巡回して使用される。ファイル名に%gを含んでいない場合、ログファイルを識別するために「.数字」という拡張子が付加される。

ファイルパスがc:\logfile.logでファイル数が3
c:\logfile.log.0
c:\logfile.log.1
c:\logfile.log.2

ファイルパスがc:\logfile%g.logでファイル数が2
c:\logfile0.log
c:\logfile1.log

サンプルコード

import java.util.logging.*;
import java.io.*;

public class UseHandler {
    public static void main(String[] args) {
        try{
            // ハンドラオブジェクトの生成
            FileHandler handler = 
               new FileHandler("c:\\logging.log", 1000, 3);

            // Loggerオブジェクトの生成
            Logger logger = Logger.getLogger("Sample");

            // Loggerオブジェクトにハンドラを追加
            logger.addHandler(handler);

            // ログ出力
            logger.info("ログ出力");

        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

フォーマットの指定

ログ出力のフォーマットの指定はjava.util.logging.Formatterクラスを拡張して行う。詳細はAPIドキュメントを参照。

java.util.loggingパッケージには次の2つのフォーマット定義クラスが用意されている。
SimpleFormatterシンプルなフォーマットでログを出力
XMLFormatterXMLフォーマットでログを出力

フォーマットの指定はFileHandlerクラスに対してsetFormatterメソッドを使用して行う。デフォルトではXMLFormatterが使用される。

サンプルコード
import java.util.logging.*;
import java.io.*;

public class UseHandler {
    public static void main(String[] args) {
        try{
            // ハンドラオブジェクトの生成
            FileHandler handler = 
                 new FileHandler("c:\\logging%g.log", 1000, 3);

            // 出力フォーマットの指定
            handler.setFormatter(new SimpleFormatter());
            //handler.setFormatter(new XMLFormatter());

            // Loggerオブジェクトの生成
            Logger logger = Logger.getLogger("Sample");

            // Loggerオブジェクトにハンドラを追加
            logger.addHandler(handler);

            // ログ出力
            logger.info("ログ出力");

        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

SimpleFormatterを使用した場合のログファイルの内容
2004/06/11 20:08:27 mytest.logger.UseHandler main
情報: ログ出力

XMLFormatterを使用した場合のログファイルの内容
<?xml version="1.0"
 encoding="MS932" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record>
  <date>2004-06-11T11:20:25</date>
  <millis>1086920425711</millis>
  <sequence>0</sequence>
  <logger>Sample</logger>
  <level>INFO</level>
  <class>mytest.logger.UseHandler</class>
  <method>main</method>
  <thread>10</thread>
  <message>ログ出力</message>
</record>
</log>

プロパティファイルの使用

プロパティファイルを使用してログの定義を行うことによって、プログラム内でログの形式を指定する必要がなくなる。
java.util.logging.FileHandler.pattern = %t/javalogging-set%g.log
java.util.logging.FileHandler.limit = 1000000
java.util.logging.FileHandler.count = 3
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

Advertisement

ショートカット

634
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール