株式会社イーヴ

EeBlog(テクニカルブログ)

TOP > EeBlog > 第65回 ロギングその4

第65回 ロギングその4

引き続き「ロギング」をテーマにしていきます。

前回まではFileHandlerのコンストラクタにファイル名を渡していました。
今回はファイル名にローテーション番号を含めたりする設定方法を学びます。

コンストラクタに渡すファイル名には、下記の特殊な意味を持つ文字列を使うことができます。
・「/」ローカルパス名の区切り文字
・「%t」システムの一時ディレクトリ
・「%h」user.home システムプロパティーの値
・「%g」ログのローテーションを識別する生成番号
・「%u」重複を解決する一意の番号
・「%%」単一のパーセント符号%に変換

これらは実行時に置換されます。

「%u」に関してはイメージがしにくいと思うので、補足しておきます。
FileHandlerがファイルを開く際に、そのファイルが別のプロセスで使用中の場合があります。
そのとき、FileHandlerは「%u」で示される番号を増分して、再度読み込もうとします。
この処理は現在使用されていないファイルが見つかるまで、繰り返されます。
なお、「%u」のデフォルト値は0です。

以下のサンプルコードでは、匿名Loggerオブジェクトを作ってログ出力をしています。
ユーザーのホームディレクトリにログファイルが作成されます。(J2SE1.4以上対応)

import java.util.logging.FileHandler;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.logging.SimpleFormatter;


 public class HandlerTest {
     public static void main(String[] args) throws Exception {


         FileHandler fileHandler = null;
         String pattern = "%h/HandlerTest%g.log";// 出力ファイルの名前付けのパターン
        int limit = 10000;// 任意の 1 つのファイルに書き込む最大バイト数
        int count = 3;// 使用するファイル数
        boolean append = true;// 追加モードを指定する


        try {
             // 追記モードでFileHandler作成
            fileHandler = new FileHandler(pattern, limit, count, append);


             // ログフォーマット変更
            fileHandler.setFormatter(new SimpleFormatter());


             // 匿名Logger取得
            Logger logger = Logger.getAnonymousLogger();


             // Loggerのログレベル指定
            logger.setLevel(Level.ALL);


             // LoggerにHandler追加
            logger.addHandler(fileHandler);


             // ログ出力
            logger.severe("SEVERE は重大な障害を示すメッセージレベルです。 ");
             logger.warning("WARNING は潜在的な問題を示すメッセージレベルです。 ");
             logger.info("INFO はメッセージを情報として提供するメッセージレベルです。 ");
             logger.config("CONFIG は静的な構成メッセージのメッセージレベルです。");
             logger.fine("FINE はトレース情報を提供するメッセージレベルです。 ");
             logger.finer("FINER はかなり詳細なトレースメッセージを示します。 ");
             logger.finest("FINEST は非常に詳細なトレースメッセージを示します。 ");


         } finally {
             if (fileHandler != null) {
                 fileHandler.close();
             }
         }
     }
 }

ホームディレクトリにローテーション番号付きのファイルが出力されましたね。
ちなみに、FileHandlerのデフォルトの出力先もホームディレクトリとなっています。