ここまでは、ロギングAPIやプロパティファイルをどのように利用すればログが出力されるのか、について説明してきました。
ここからは、ロギングに関するプログラミングを実際に行う際の話題について、簡単にお伝えします。
現実的なログファイルでは、ログのフォーマットを変更したくなったり、あるいはログのフォーマットが決められている場合があります。
このような場合には、下記のようにjava.util.logging.Formatterクラスを継承したフォーマッタクラスを作成してフォーマットを変更します。
formatメソッドの内容を以下のように変更して、ログ1件がテキストファイル上の1行で表現されるように変更してみましょう。
MyLogFormatter.java | |
|
作成したログフォーマッタクラスを利用するようにするため、javalog.propertiesプロパティファイルを下記のように変更します。
javalog.propertiesファイル(作成したログフォーマッタクラスを利用する設定例) | |
|
この状態でSampleLogging5クラスを実行すると、以下のように標準エラー出力へのログ出力のフォーマットが変わっていることが確認できます。
2007-11-19 14:14:05.672 CONFIG SampleLogging - ログ設定: LogManagerを設定しました。
2007-11-19 14:14:05.813 FINEST SampleLogging - 隣の客はよく柿食う客だ。
2007-11-19 14:14:05.813 FINER SampleLogging - 東京都特許許可局。
2007-11-19 14:14:05.813 FINE SampleLogging - かえるぴょこぴょこ。
2007-11-19 14:14:05.813 CONFIG SampleLogging - 庭には二羽鶏が。
2007-11-19 14:14:05.813 INFO SampleLogging - 生麦生米生卵。
2007-11-19 14:14:05.813 WARN SampleLogging - あかまきがみ。
2007-11-19 14:14:05.813 SEVERE SampleLogging - すもももももももものうち。
プログラム動作の状況や結果を追跡する目的でロギングされたログを「トレースログ」と呼びます。Eclipseの統合開発環境などを用いた対話的なデバッグが利用できない場合などに、よくトレースログを活用します。
一般的には、トレースログは 通常利用時には出力しないようにすることがほとんどです。このため、FINE、FINER、FINESTレベルのいずれかを利用してロギングされることになります。そして現実的には、FINESTレベルを利用するのが無難なことでしょう。
さらに、トレースログは一般的に大量に出力されます。この大量のトレースログの処理が実行性能を引き下げてしまうことがあります。このような状況を防ぐために、トレースログは定数を利用した条件分岐などを利用して完全に無効化してしまう場合もあります。
定数を用いた無効化を利用すると、再コンパイルを実施しないとロギングの有効化・無効化を切り替えることができなくなりますが、性能低下を避けるために、どうしてもその対応が必要となる場合があります。
定数を利用した条件分岐を用いたトレースログの無効化の例を以下に示します。
|
実際のロギング・プログラミングでは、ログレベルの使い分けが難易度の高いものの1つになる場合が多いです。どのような場合にどのログレベルを利用するのかについて、注意が必要となってくるのです。
もし、あなたが何かのソフトウェア開発プロジェクトの一員であるのなら、そのプロジェクトで決められたログレベルの運用ルールに従う必要があります。ログレベルは 全体的な統一感をもって運用される必要があるからです。
一般的には、ソフトウェア開発が一段落した後、ソフトウェア運用の際に適用されるログレベルはINFO、WARNING、SEVEREレベルなどになると考えます。場合によっては CONFIGレベルも含まれることがあるでしょう。オンライン処理とバッチ処理でログ出力指針が異なってくることもあります。
架空のプロジェクトにおけるログレベル指針を参考までに示します。
SEVERE | 致命的な状況やエラーについての情報。問題が発生しており、処理が続行不能な状況 |
---|---|
WARNING | 警告についての情報。問題が発生しているものの、処理は続行可能な状況 |
INFO | 正常系の情報。特に重要なポイントを通過した |
CONFIG | 設定情報に関する情報 |
FINE | デバッグ情報。比較的重要だが運用時にロギングする必要のない情報 |
FINER | 特定の処理についての開始および終了の情報。内部的に発生した例外に関する情報 |
FINEST | トレース情報 |
表2 ログレベル指針の例 |
ログとは難しいもので、大量にロギングすると嫌がられる一方で、必要な情報をロギングしないと非難されてしまいます。特に、INFO、WARNING、SEVEREについては、必要十分なロギングを行う必要が出てきます。実際にログファイルに出力されたログを見て、初めてどのようにロギングすべきかについての判断が可能となる場合もあります。
参考までに、筆者が現在取り組んでいる「blancoLog」というjava.util.loggingへのログ出力をApache log4jにリダイレクトするためのオープンソース・ユーティリティを紹介させていただきます。
この記事でも紹介したように、原稿執筆時点(2007年12月)においては、多くの場合ロギングのインターフェイスとしてApache Commons Loggingを利用することが多いように思います。
ところが、Apache Commons Loggingを利用すると、Javaソースコードにorg.apache.commons.logging.*のimport文が必要になってしまいます。「ロギングはしておきたいのだけれども、Javaのimport文に標準Java API以外のものが入るのは好ましくない」というジレンマを感じている方は多いように考えます。
一方で、Apache log4jのノウハウは多くたまっており、Apache log4jもしくはApache Commons Loggingのインターフェイスを利用せざるを得ないという状況があることも確かです。
これを解決するために、blancoLogというオープンソースのユーティリティの開発に取り組んでいます。具体的には、java.util.logging.Handlerクラスを継承したクラスを作成し、ログ出力をApache log4jクラスへとリダイレクトしてしまうというものです。
つまりは、java.util.loggingをApache Commons Loggingの代わりに使ってしまおうとする取り組みです。Java標準APIのみを利用し、かつApache log4jのロギングを利用してしまおうとするのです。
取り組み始めたばかりのオープンソースですが、ご興味を感じられましたら、試用されることをお勧めしたく思います。
ログやログファイル、そしてログを扱うAPIを用いたプログラミングについて紹介してきましたが、どういうものなのかお分かりいただけましたでしょうか。
冒頭で紹介したように、ログに関するプログラミングは初心者にとっては少し難易度の高いものとなります。これに加えて、ログファイルに関する常識や、さらにはログファイルに関する運用などの面を考慮する必要が出てくると、より一層難易度の高いものになってしまいます。
その一方で、ロギングを行うことにより、各種情報をプログラムの外へと伝達できるメリットもかなり大きなものなのです。ぜひログファイルを扱う技術を身に付けて、活用できるようになっていきましょう!
blanco Framework(コミッタ)
伊賀 敏樹(いが としき)
ハンドル:いがぴょん
1968年生まれ。現在、NTTデータ ビジネスブレインズ 第一SI事業部 ソリューショングループ所属。システム開発の技術支援などに従事する。仕事におけるJava言語とのかかわりは1998年から。 現在 blanco Frameworkというオープンソースによるソースコード自動生成タイプの開発フレームワーク提供に取り組んでいる。 趣味はヴァイオリン演奏。アマチュアオーケストラで演奏することもある。
ホームページ
いがぴょんの日記ウェブページv2(1996年から続けているWeb日記)
主な著書
「やさしく学ぶ基礎からのJDBC」
「Javaプログラミング[アプリケーション編]ステップアップラーニング」
Copyright © ITmedia, Inc. All Rights Reserved.