第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のデフォルトの出力先もホームディレクトリとなっています。