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

