ネットでよく耳にする「過去ログ」や「ログを確認する」という言葉はプログラムの世界では非常にメジャーなものです。
ロギングという言葉で表されますが、これは「起こった出来事についての情報などを一定の形式で時系列に記録・蓄積すること」を指し、このロギングによって記録されたデータのことを「Log(ログ)」と呼びます。
今回はこのロギングと”Loggerクラス”を使ってログを出力する方法について解説してみたいと思います。
ロギングとは
冒頭でも説明していますが、ロギングとは「起こった出来事についての情報などを一定の形式で時系列に記録・蓄積すること」を指します。
ロギングによって蓄積された記録には次の様な内容が記載されています。
- 使用している設定値や詳細な情報表示などデバッグ用の表示
- 正常動作の記録
- 警告を出しておきたい動作の記録
- エラーなどの問題の記録
- 停止してしまうような致命的な記録
またこれらの内容は致命度によっていくつかに分類されます。
ログレベルについて
先ほど解説した「致命度による分類」をログレベルと言い、そのレベルは次のようになっています。
- レベル分類 – Levelクラスの定数 – Loggerクラスのメソッド
- 最も詳細 – FINEST – finest
- 詳細 – FINER – finer
- 普通 – FINE – fine
- 構成 – CONFIG – config
- 情報 – INFO – info
- 警告 – WARNING – warning
- 重大 – SEVERE – severe
このレベルを基準としてどのレベルからを履歴に残すか選択が出来ます。
例)Level.INFOとして設定すると、「情報」「警告」「重大」の3種を履歴として保存。
Loggerでログを出力させる
ログを出力させるには、いくつかのクラスを組み合わせる必要があります。
詳しい説明の前にまずはコード全体を見てみましょう。
import java.io.IOException; import java.util.logging.FileHandler; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; public class LoggingSample { public static void main(String[] arg) throws SecurityException, IOException { Logger logger = Logger.getLogger(LoggingSample.class.getName()); logger.setLevel(Level.INFO); Handler handler = new FileHandler("C:\\sample\\sample.log", true); handler.setFormatter(new SimpleFormatter()); logger.addHandler(handler); logger.finest("FINEST"); logger.finer("FINER"); logger.fine("FINE"); logger.config("CONFIG"); logger.info("INFO"); logger.warning("WARNING"); logger.severe("SEVERE"); logger.log(Level.INFO, "エラー発生", new RuntimeException("Runtime Error")); } }
実行結果
11月 28, 2019 7:53:33 午後 LoggingSample main 情報: INFO 11月 28, 2019 7:53:33 午後 LoggingSample main 警告: WARNING 11月 28, 2019 7:53:33 午後 LoggingSample main 重大: SEVERE 11月 28, 2019 7:53:33 午後 LoggingSample main 警告: エラー発生 java.lang.RuntimeException: Runtime Error at LoggingSample.main(LoggingSample.java:27)
では早速、上のコードの説明に入ります。
まずはじめにLoggerオブジェクトを作成します。
続いてファイルに出力させる設定に入ります。
この設定では、Handlerインターフェースの実装クラス”FileHandler”を利用します。
今回はCドライブ直下に”sample”というフォルダを作成し、そこに”sample.log”というファイルで出力させるため、”FileHandler”の第一引数には「C:\\sample\\sample.log」と記述しています。
また、”FileHandler”メソッドの第二引数にBoolean型を指定することで、上書きさせるか追記させるかの指定が出来ます。
尚”true”の場合には上書き型、”false”の場合には追記型となります。
そして最後に、先ほど作成したHandlerオブジェクトに”setFormatter”メソッドを使って出力時のフォーマットを指定します。
デフォルトではXMLとなっていますが、今回は読みやすい形式で出力させたいので”SimpleFormatter”を指定しています。
これでLoggerオブジェクトから”addHandler”メソッドに引数でfHandlerを指定して呼び出せば、エラーログが出力されます。
例外をスローさせるためのlogメソッドでは、第一引数でログレベル、第二引数でエラー発生時に出力させるメッセージ、第三引数でオブジェクトを指定します。
こうすることでスタックトレースの内容が表示されるようになるので、どのような例外がいつどこで発生したのか情報を取得できます。
Loggingを行う上で留意する事
ここまではLoggingについての解説をしてきましたが、この項目ではLoggingを行う上で留意しておくべき点について少し解説したいと思います。
単純にLoggingを行ってもその情報が使えなければ何の役にも立ちません。
また誰もが見れるようなものであるなら、それはセキュリティーホールを自ら公開しているのと同じことになります。
よってLoggingを行う場合には、以下の点に留意しましょう。
- フォーマット
- 実行時刻、出力箇所、種類、メッセージは最低限出力表示するさせる
- 出力先
- 重大なエラーや重要情報等が出力された場合、誰もが見れる場所に置いておくとそれが原因で大変な事態を招くことも。ログファイルは必ず一般公開されていない階層に置くようにする
- ログメッセージ
- わかりやすい内容で簡潔になるよう心掛ける。他の人が見てもすぐわかるようにする。またマルチバイト文字は出来るだけ避ける。
まとめ
いかがでしたか?
今回はLoggerの使い方について解説してみました。
初心者の方には若干難しく感じたかもしれませんが、Loggingはとても重要なセクターですので、何度も読み返して理解してみましょう。
またこれ以外にも複雑な構造のプログラムもまだまだたくさんありますので、これを機にロジックをより簡単に読み解く方法についても考えてみましょう。