Javaでのロガー – Javaログの例

今日はJavaでLoggerを見ていきます。Java LoggerはJavaプログラミングでのログ記録を提供します。

JavaでのLogger

Javaログ記録 API は1.4で導入され、Javaログ記録APIを使用してアプリケーションメッセージをログ記録できます。このJavaログ記録チュートリアルでは、Java Loggerの基本的な機能を学びます。また、さまざまなログ記録レベル、ログ記録ハンドラ、フォーマッター、フィルター、ログマネージャー、およびログ記録設定のJava Loggerの例も見ていきます。

Java Logger

java.util.logging.Loggerは、Javaログ記録APIでアプリケーションメッセージをログ記録するために使用されるクラスです。非常にシンプルな一行のコードでJava Loggerを作成できます。

Logger logger = Logger.getLogger(MyClass.class.getName());

Javaログ記録レベル

java.util.logging.LevelはJavaのログレベルを定義します。Javaのログには7つのレベルがあります。

  1. SEVERE(最上位)
  2. WARNING
  3. INFO
  4. CONFIG
  5. FINE
  6. FINER
  7. FINEST

他に2つのログレベルがあります。OFFはすべてのログをオフにし、ALLはすべてのメッセージをログに記録します。以下のコードを使用して、ロガーレベルを設定できます:

logger.setLevel(Level.FINE);

ログは、ロガーレベル以上のすべてのレベルのメッセージに対して生成されます。たとえば、ロガーレベルがINFOに設定されている場合、INFO、WARNING、およびSEVEREのログメッセージが生成されます。

Javaログハンドラー

JavaログAPIでは、複数のハンドラーをJavaロガーに追加し、メッセージをログするときに各ハンドラーがそれに応じて処理します。Java Logging APIには、2つのデフォルトのハンドラーが提供されています。

  1. ConsoleHandler: このハンドラーはすべてのログメッセージをコンソールに書き込みます。
  2. FileHandler: このハンドラーはすべてのログメッセージをXML形式でファイルに書き込みます。

特定のタスクを実行するために、独自のカスタムハンドラーを作成することもできます。独自のハンドラークラスを作成するには、java.util.logging.Handlerクラスまたはそのサブクラス(StreamHandler、SocketHandlerなど)を拡張する必要があります。以下は、カスタムJavaロギングハンドラーの例です:

package com.journaldev.log;

import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;

public class MyHandler extends StreamHandler {

    @Override
    public void publish(LogRecord record) {
        //独自のロジックを追加して公開する
        super.publish(record);
    }


    @Override
    public void flush() {
        super.flush();
    }


    @Override
    public void close() throws SecurityException {
        super.close();
    }

}

Javaログフォーマッター

フォーマッターは、ログメッセージの書式を設定するために使用されます。JavaログAPIには、2つの利用可能なフォーマッターがあります。

  1. SimpleFormatter:このフォーマッターは、基本情報を含むテキストメッセージを生成します。ConsoleHandlerは、このフォーマッタークラスを使用してログメッセージをコンソールに出力します。
  2. XMLFormatter:このフォーマッターは、ログのためのXMLメッセージを生成します。FileHandlerは、デフォルトのフォーマッターとしてXMLFormatterを使用します。

ハンドラーのいずれかにjava.util.logging.Formatterクラスを拡張することで、独自のカスタムフォーマッタークラスを作成し、それを添付することができます。以下は、単純なカスタムフォーマッタークラスの例です。

package com.journaldev.log;

import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

public class MyFormatter extends Formatter {

    @Override
    public String format(LogRecord record) {
        return record.getThreadID()+"::"+record.getSourceClassName()+"::"
                +record.getSourceMethodName()+"::"
                +new Date(record.getMillis())+"::"
                +record.getMessage()+"\n";
    }

}

Javaでのロガー – Javaログマネージャー

java.util.logging.LogManagerは、ログ設定を読み取り、ロガーインスタンスを作成し、管理するクラスです。このクラスを使用して、独自のアプリケーション固有の設定を行うことができます。

LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));

以下は、Java Logging API設定ファイルの例です。何も設定しない場合、JREホームのlib/logging.propertiesファイルから読み込まれます。mylogging.properties

handlers= java.util.logging.ConsoleHandler

.level= FINE

# デフォルトのファイル出力先はユーザーのホームディレクトリです。
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# コンソールに出力されるメッセージをINFO以上に制限します。
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.journaldev.files = SEVERE

以下は、JavaでLoggerを使用する例を示す単純なJavaプログラムです。

package com.journaldev.log;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class LoggingExample {

    static Logger logger = Logger.getLogger(LoggingExample.class.getName());
    
    public static void main(String[] args) {
        try {
            LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
        } catch (SecurityException | IOException e1) {
            e1.printStackTrace();
        }
        logger.setLevel(Level.FINE);
        logger.addHandler(new ConsoleHandler());
        // カスタムハンドラを追加
        logger.addHandler(new MyHandler());
        try {
            // FileHandlerファイル名と最大サイズ、ログファイル数の制限を指定
            Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
            fileHandler.setFormatter(new MyFormatter());
            // FileHandler用のカスタムフィルタを設定
            fileHandler.setFilter(new MyFilter());
            logger.addHandler(fileHandler);
            
            for(int i=0; i<1000; i++){
                // ログメッセージ
                logger.log(Level.INFO, "Msg"+i);
            }
            logger.log(Level.CONFIG, "Config data");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }

}

上記のJavaロガーの例プログラムを実行すると、CONFIGログがファイルに出力されないことがわかります。これは、MyFilterクラスのためです。

package com.journaldev.log;

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	public boolean isLoggable(LogRecord log) {
		// CONFIGログをファイルに記録しない
		if(log.getLevel() == Level.CONFIG) return false;
		return true;
	}

}

また、出力形式はMyFormatterクラスで定義されたものと同じになります。

1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980

FileHandlerに独自のFormatterクラスを追加しない場合、ログメッセージは次のように出力されます。

<record>
  <date>2012-12-14T17:03:13</date>
  <millis>1355533393319</millis>
  <sequence>996</sequence>
  <logger>com.journaldev.log.LoggingExample</logger>
  <level>INFO</level>
  <class>com.journaldev.log.LoggingExample</class>
  <method>main</method>
  <thread>1</thread>
  <message>Msg996</message>
</record>

コンソールログメッセージの形式は次のとおりです:

Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998

以下の画像は、最終的なJavaロガーの例プロジェクトを示しています。これで、JavaにおけるLoggerとJava Loggerの例に関する説明は終わりです。プロジェクトは以下のリンクからダウンロードできます。

Javaロガーの例題プロジェクトをダウンロード

参照: JavaログAPI

Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example