連載
» 2008年01月08日 00時00分 公開

プログラマーの常識をJavaで身につける(10):入門から実践までJavaで学べる「ログ」の常識 (4/4)

[伊賀敏樹,株式会社 NTTデータ ビジネスブレインズ]
前のページへ 1|2|3|4       

【実践】開発現場におけるロギングの実際

 ここまでは、ロギングAPIやプロパティファイルをどのように利用すればログが出力されるのか、について説明してきました。

 ここからは、ロギングに関するプログラミングを実際に行う際の話題について、簡単にお伝えします。

ログのフォーマットを変更

 現実的なログファイルでは、ログのフォーマットを変更したくなったり、あるいはログのフォーマットが決められている場合があります。

 このような場合には、下記のようにjava.util.logging.Formatterクラスを継承したフォーマッタクラスを作成してフォーマットを変更します。

 formatメソッドの内容を以下のように変更して、ログ1件がテキストファイル上の1行で表現されるように変更してみましょう。

MyLogFormatter.java
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

/**
* シンプルなサンプルログフォーマッタ
*/
public class MyLogFormatter extends Formatter {
    private final SimpleDateFormat sdFormat
        = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    public String format(final LogRecord argLogRecord) {
        final StringBuffer buf = new StringBuffer();

        buf.append(sdFormat.format(
            new Date(argLogRecord.getMillis())));
        buf.append(" ");

        if (argLogRecord.getLevel() == Level.FINEST) {
            buf.append("FINEST");
        } else if (argLogRecord.getLevel() == Level.FINER) {
            buf.append("FINER ");
        } else if (argLogRecord.getLevel() == Level.FINE) {
            buf.append("FINE ");
        } else if (argLogRecord.getLevel() == Level.CONFIG) {
            buf.append("CONFIG");
        } else if (argLogRecord.getLevel() == Level.INFO) {
            buf.append("INFO ");
        } else if (argLogRecord.getLevel() == Level.WARNING) {
            buf.append("WARN ");
        } else if (argLogRecord.getLevel() == Level.SEVERE) {
            buf.append("SEVERE");
        } else {
            buf.append(Integer.toString(argLogRecord.getLevel()
                .intValue()));
            buf.append(" ");
        }
        buf.append(" ");
        buf.append(argLogRecord.getLoggerName());
        buf.append(" - ");
        buf.append(argLogRecord.getMessage());
        buf.append("\n");

        return buf.toString();
    }
}

 作成したログフォーマッタクラスを利用するようにするため、javalog.propertiesプロパティファイルを下記のように変更します。

javalog.propertiesファイル(作成したログフォーマッタクラスを利用する設定例)
handlers=java.util.logging.ConsoleHandler
.level=FINEST

java.util.logging.ConsoleHandler.level=FINEST
java.util.logging.ConsoleHandler.formatter=MyLogFormatter

 この状態で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レベルを利用するのが無難なことでしょう。

 さらに、トレースログは一般的に大量に出力されます。この大量のトレースログの処理が実行性能を引き下げてしまうことがあります。このような状況を防ぐために、トレースログは定数を利用した条件分岐などを利用して完全に無効化してしまう場合もあります。

 定数を用いた無効化を利用すると、再コンパイルを実施しないとロギングの有効化・無効化を切り替えることができなくなりますが、性能低下を避けるために、どうしてもその対応が必要となる場合があります。

 定数を利用した条件分岐を用いたトレースログの無効化の例を以下に示します。

private static final boolean DEBUG = false;

if (DEBUG) {
    logger.finest(
        "トレース: ロガーのインスタンスを取得しました。");
}

ログレベルの使い分け

 実際のロギング・プログラミングでは、ログレベルの使い分けが難易度の高いものの1つになる場合が多いです。どのような場合にどのログレベルを利用するのかについて、注意が必要となってくるのです。

 もし、あなたが何かのソフトウェア開発プロジェクトの一員であるのなら、そのプロジェクトで決められたログレベルの運用ルールに従う必要があります。ログレベルは 全体的な統一感をもって運用される必要があるからです。

 一般的には、ソフトウェア開発が一段落した後、ソフトウェア運用の際に適用されるログレベルはINFO、WARNING、SEVEREレベルなどになると考えます。場合によっては CONFIGレベルも含まれることがあるでしょう。オンライン処理バッチ処理でログ出力指針が異なってくることもあります。

 架空のプロジェクトにおけるログレベル指針を参考までに示します。

SEVERE 致命的な状況やエラーについての情報。問題が発生しており、処理が続行不能な状況
WARNING 警告についての情報。問題が発生しているものの、処理は続行可能な状況
INFO 正常系の情報。特に重要なポイントを通過した
CONFIG 設定情報に関する情報
FINE デバッグ情報。比較的重要だが運用時にロギングする必要のない情報
FINER 特定の処理についての開始および終了の情報。内部的に発生した例外に関する情報
FINEST トレース情報
表2 ログレベル指針の例

 ログとは難しいもので、大量にロギングすると嫌がられる一方で、必要な情報をロギングしないと非難されてしまいます。特に、INFO、WARNING、SEVEREについては、必要十分なロギングを行う必要が出てきます。実際にログファイルに出力されたログを見て、初めてどのようにロギングすべきかについての判断が可能となる場合もあります。

【参考】java.util.loggingをApache log4jにリダイレクト

参考までに、筆者が現在取り組んでいる「blancoLog」というjava.util.loggingへのログ出力をApache log4jにリダイレクトするためのオープンソース・ユーティリティを紹介させていただきます。

図6 blancoLogのページ 図6 blancoLogのページ

この記事でも紹介したように、原稿執筆時点(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のロギングを利用してしまおうとするのです。

取り組み始めたばかりのオープンソースですが、ご興味を感じられましたら、試用されることをお勧めしたく思います。


編集部注blancoLogを含むblanco Framework全体について詳しく知りたい読者は特集記事「Excelからプログラムを作る多言語対応オープンソース」をご参照ください。

難易度が高いが、メリットも大きい「ログ」

 ログやログファイル、そしてログを扱うAPIを用いたプログラミングについて紹介してきましたが、どういうものなのかお分かりいただけましたでしょうか。

 冒頭で紹介したように、ログに関するプログラミングは初心者にとっては少し難易度の高いものとなります。これに加えて、ログファイルに関する常識や、さらにはログファイルに関する運用などの面を考慮する必要が出てくると、より一層難易度の高いものになってしまいます。

 その一方で、ロギングを行うことにより、各種情報をプログラムの外へと伝達できるメリットもかなり大きなものなのです。ぜひログファイルを扱う技術を身に付けて、活用できるようになっていきましょう!

筆者紹介

blanco Framework(コミッタ)

伊賀 敏樹(いが としき)
ハンドル:いがぴょん

1968年生まれ。現在、NTTデータ ビジネスブレインズ 第一SI事業部 ソリューショングループ所属。システム開発の技術支援などに従事する。仕事におけるJava言語とのかかわりは1998年から。 現在 blanco Frameworkというオープンソースによるソースコード自動生成タイプの開発フレームワーク提供に取り組んでいる。 趣味はヴァイオリン演奏。アマチュアオーケストラで演奏することもある。

ホームページ
いがぴょんの日記ウェブページv2(1996年から続けているWeb日記)

主な著書
やさしく学ぶ基礎からのJDBC
Javaプログラミング[アプリケーション編]ステップアップラーニング



前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。