Java Logging APIでログを出力する

 Java Logging APIはJ2SE 1.4から標準化されたロギングAPIで、 Javaアプリケーションのログをコンソールやテキストファイル、 より一般的な出力ストリーム(OutputStream)などに出力することができます。 System.out.printlnを使ういわゆるprintfデバッグに比べて、 ログ出力を実施したクラス名とメソッド名が自動的に記録されるので、 より便利に使うことができます。

 なお、Javaのロギング機構というと、オープンソースの Apache Log4jが最も有名と思います。 Log4Jについては、Jakarta Commons Loggingと組み合わせて使うことが多いと思うので、 Jakarta Commonsのセクションでこっそり紹介しています。
それでこのページの趣旨に戻って、 J2SE 1.4で標準実装されたロギングAPIはそれよりもずっとシンプルですが、充分実用になると思います。 ちなみに、J2SE 1.2や1.3でこのロギングAPIを使うために、オープンソースでAPIを実装した Lumberjack Java Logging API というパッケージもあります。 使ったことはありませんが、どうしてもJ2SDK 1.2〜1.3でなくてはならない環境下で役立つかもしれません。

サンプルその1
 以下のコードが最も単純な使用例でしょう。 Loggerクラスの機能を簡単に使うために用意されているインスタンス、 Logger.globalを使っています。

import java.util.logging.Logger;

/**
 * デフォルトのろがー(Logger.global)を使用した例
 * 2003/01/05
 */
public class LoggingExample1 {

    public void method1() {
        Logger.global.info("メソッド1にいます。");
    }

    public static void main(String[] args) {
        Logger.global.info("メインメソッドにいます。");
        LoggingExample1 my = new LoggingExample1();
        my.method1();
    }
}

 ログを出力するには、 Loggerインスタンスのinfo、warning、severe といったメソッドを使います。それぞれログのレベルが異なります。 このLogger.globalの出力はコンソールです。 これは、Logger.globalの「出力ハンドラ」 がデフォルトでConsoleHandlerクラスのインスタンスになっているためです。 出力はコンソール固定です。 リダイレクトはできないので、注意が必要です。

サンプルその2
 今度はより一般的な使い方で、ローテーションファイルに出力しています。

/**
 * LoggingExample2.java
 * ローテーションファイルへのログ出力のサンプル
 */
import java.util.logging.*;

public class LoggingExample2 {
    private static Logger logger = Logger.getLogger("MyLog");
    // ローテーションファイルの使用。
    // 2番目の引数はファイルの最大サイズ、3番目はファイルの数です。
    private static FileHandler handler;
    static {
      try {
        handler = new FileHandler("%t/javalogging-set%g.log", 1000000, 3);
      } catch(java.io.IOException ex){
        ex.printStackTrace();
      }
    }

    public LoggingExample2() {
        // FileHandlerのデフォルトのformatterはXMLFormatterですが、
        // SimpleFormatterに変更
        handler.setFormatter(new SimpleFormatter());
        logger.addHandler(handler);
        logger.setLevel(Level.ALL);
        logger.info("Logging is configured.");
    }

    public void method1() {
        logger.info("メソッド1にいます。");
        logger.warning("Warning! メソッド1にいます。");
        logger.severe("Severe! メソッド1にいます。");
    }

    public static void main(String[] args) {
        LogManager.getLogManager().removeAllGlobalHandlers();
        LoggingExample2 my = new LoggingExample2();
        my.method1();
        // handler.close();
    }
}

ファイルへの出力をプロパティファイルで設定する
 $JAVA_HOME/jre/lib/logging.properties ファイルを編集して、 このプロパティファイルの中でログファイルのパス等を設定すれば、 プログラム中で指定しなくてもファイルへの出力が可能です。 これにより、プログラムを修正することなく、ログ出力レベルやログファイルのパスを変更することができ、 とても便利です。

 ファイル出力を行わせるには、logging.propertiesの handlers行を次のようにします。

handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler

また、パスなどの指定は次のようにします。

java.util.logging.FileHandler.pattern = %t/javalogging-set%g.log
java.util.logging.FileHandler.limit = 1000000
java.util.logging.FileHandler.count = 3
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

すると、実際のプログラムはこのようにとても簡単になります。

import java.util.logging.*;
public class LoggingExample4 {
    private static Logger logger = Logger.getLogger("MyLog");

    public LoggingExample4() {
        logger.info("コンストラクタにいます。");
    }

    public void method1() {
        logger.info("メソッド1にいます。");
        logger.warning("Warning! メソッド1にいます。");
        logger.severe("Severe! メソッド1にいます。");
    }

    public static void main(String[] args) {
        LoggingExample4 my = new LoggingExample4();
        my.method1();
    }
}

Java kowaza Top

(first uploaded 2003/01/09 last updated 2004/09/03, URANO398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル