Javaでログを出力する(java.util.loggingパッケージ利用)
Javaでログを出力するには、Javaの標準APIであるjava.util.loggingパッケージを利用しする方法がある。
ログを出力する
1 2 3 4 5 6 7 8 9 10 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); // ログを出力する logger.log(Level.FINEST, "ログ出力テスト:finest"); logger.log(Level.FINER, "ログ出力テスト:finer"); logger.log(Level.FINE, "ログ出力テスト:fine"); logger.log(Level.CONFIG, "ログ出力テスト:config"); logger.log(Level.INFO, "ログ出力テスト:info"); logger.log(Level.WARNING, "ログ出力テスト:warning"); logger.log(Level.SEVERE, "ログ出力テスト:severe"); |
Java標準APIでのログ出力の基本は、java.util.logging.Loggerクラス。
Logger.getLogger()で、ロガーに設定する名称をパラメータで渡し、ロガー(Loggerクラスのインスタンス)を取得する。
ロガーに設定する名称としてFQCN(完全修飾クラス名:this.getClass().getName())を利用することが多い。
log(Level level, String msg)メソッドで、ログレベルとログメッセージをパラメータで渡し、ログを出力する。(ログレベルについては後述)
尚、上記の例では標準エラー出力にのみログ内容が出力され、ファイルには出力されない。
ログをファイルに出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); try { // 出力ファイルを指定する FileHandler fh = new FileHandler("SampleLog.log"); logger.addHandler(fh); } catch (IOException e) { e.printStackTrace(); } // ログを出力する logger.log(Level.FINEST, "ログ出力テスト:finest"); logger.log(Level.FINER, "ログ出力テスト:finer"); logger.log(Level.FINE, "ログ出力テスト:fine"); logger.log(Level.CONFIG, "ログ出力テスト:config"); logger.log(Level.INFO, "ログ出力テスト:info"); logger.log(Level.WARNING, "ログ出力テスト:warning"); logger.log(Level.SEVERE, "ログ出力テスト:severe"); |
java.util.logging.FileHandlerクラスを使うことでファイルにも出力できる。
上記の例では、実行ディレクトリのSampleLog.logというファイルにログが出力される。
ただし、出力結果はXML形式となる。
ログファイルの出力書式を変更する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); try { // 出力ファイルを指定する FileHandler fh = new FileHandler("SampleLog.log"); // 出力フォーマットを指定する fh.setFormatter(new java.util.logging.SimpleFormatter()); logger.addHandler(fh); } catch (IOException e) { e.printStackTrace(); } // ログを出力する logger.log(Level.FINEST, "ログ出力テスト:finest"); logger.log(Level.FINER, "ログ出力テスト:finer"); logger.log(Level.FINE, "ログ出力テスト:fine"); logger.log(Level.CONFIG, "ログ出力テスト:config"); logger.log(Level.INFO, "ログ出力テスト:info"); logger.log(Level.WARNING, "ログ出力テスト:warning"); logger.log(Level.SEVERE, "ログ出力テスト:severe"); |
Java標準APIでのログ出力の標準設定はXML形式になっているが、FileHandlerに対してjava.util.logging.SimpleFormatterクラスを設定することで、コンソール出力と同じ書式でファイルに出力できる。
ログレベルを変更する
ログレベルは、文字通りログ出力制御のレベルを指定するために利用されるもので、java.util.logging.Levelクラスで定義されている。
Java標準APIでのログ出力の標準設定では、ログレベルがINFOまでになっており、INFOレベルより下のレベルのログは出力されない。
ログレベル、対応するLoggerクラスの簡易メソッド、それぞれの意味は下記の通り。
ログレベルの種類(レベルの昇順)
Levelクラス定数 | Loggerクラス 簡易メソッド | 意味 |
---|---|---|
Level.FINEST | finest(String msg) | 詳細レベル(高)/最も詳細 |
Level.FINER | finer(String msg) | 詳細レベル(中)/詳細 |
Level.FINE | fine(String msg) | 詳細レベル(低)/普通 |
Level.CONFIG | config(String msg) | 設定/構成 |
Level.INFO | info(String msg) | 情報 |
Level.WARNING | warning(String msg) | 警告 |
Level.SEVERE | severe(String msg) | 致命的/重大 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); try { // 出力ファイルを指定する FileHandler fh = new FileHandler("SampleLog.log"); // 出力フォーマットを指定する fh.setFormatter(new java.util.logging.SimpleFormatter()); logger.addHandler(fh); } catch (IOException e) { e.printStackTrace(); } // 出力レベルをCONFIG以上に設定する logger.setLevel(Level.CONFIG); // ログを出力する logger.log(Level.FINEST, "ログ出力テスト:finest"); logger.log(Level.FINER, "ログ出力テスト:finer"); logger.log(Level.FINE, "ログ出力テスト:fine"); logger.log(Level.CONFIG, "ログ出力テスト:config"); logger.log(Level.INFO, "ログ出力テスト:info"); logger.log(Level.WARNING, "ログ出力テスト:warning"); logger.log(Level.SEVERE, "ログ出力テスト:severe"); |
setLevel()メソッドを使うことで、出力レベルの指定ができる。(”Level.ALL”ですべてのログレベルを出力)
ただし、これで変更されるのはファイルに対する出力レベルのみで、コンソールへの出力は変わらない。
1 2 3 4 5 6 7 8 9 10 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); // ログを出力する logger.finest("ログ出力テスト:finest"); logger.finer("ログ出力テスト:finer"); logger.fine("ログ出力テスト:fine"); logger.config("ログ出力テスト:config"); logger.info("ログ出力テスト:info"); logger.warning("ログ出力テスト:warning"); logger.severe("ログ出力テスト:severe"); |
例外のスタックトレースを出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); try { // 出力ファイルを指定する FileHandler fh = new FileHandler("SampleLog.log"); // 出力フォーマットを指定する fh.setFormatter(new java.util.logging.SimpleFormatter()); logger.addHandler(fh); } catch (IOException e) { e.printStackTrace(); } // 出力レベルをCONFIG以上に設定する logger.setLevel(Level.CONFIG); // 例外を発生させ、ログを出力する try { String s = null; s.toString(); } catch (NullPointerException e) { // スタックトレースを出力する logger.log(Level.SEVERE, "例外発生", e); } |
log(Level level, String msg, Throwable thrown)メソッドを利用することで、例外やエラーのスタックトレースを出力することができる。
追加モードで出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | // Loggerクラスのインスタンスを生成する final Logger logger = Logger.getLogger("SampleLogging"); try { // 出力ファイルを追加モードで指定する FileHandler fh = new FileHandler("SampleLog.log", true); // 出力フォーマットを指定する fh.setFormatter(new java.util.logging.SimpleFormatter()); logger.addHandler(fh); } catch (IOException e) { e.printStackTrace(); } // 出力レベルをALLに設定する logger.setLevel(Level.ALL); // ログを出力する logger.log(Level.FINEST, "ログ出力テスト:finest"); logger.log(Level.FINER, "ログ出力テスト:finer"); logger.log(Level.FINE, "ログ出力テスト:fine"); logger.log(Level.CONFIG, "ログ出力テスト:config"); logger.log(Level.INFO, "ログ出力テスト:info"); logger.log(Level.WARNING, "ログ出力テスト:warning"); logger.log(Level.SEVERE, "ログ出力テスト:severe"); |
出力ファイルを追加モードで指定しない場合、実行の度にログファイルが上書きされる。(過去のログが消える)
これを回避する為には、パラメータが2つあるFileHandlerのコンストラクタを使い、第2パラメータにtrueを設定する。