今日は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つのレベルがあります。
- SEVERE(最上位)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
他に2つのログレベルがあります。OFFはすべてのログをオフにし、ALLはすべてのメッセージをログに記録します。以下のコードを使用して、ロガーレベルを設定できます:
logger.setLevel(Level.FINE);
ログは、ロガーレベル以上のすべてのレベルのメッセージに対して生成されます。たとえば、ロガーレベルがINFOに設定されている場合、INFO、WARNING、およびSEVEREのログメッセージが生成されます。
Javaログハンドラー
JavaログAPIでは、複数のハンドラーをJavaロガーに追加し、メッセージをログするときに各ハンドラーがそれに応じて処理します。Java Logging APIには、2つのデフォルトのハンドラーが提供されています。
- ConsoleHandler: このハンドラーはすべてのログメッセージをコンソールに書き込みます。
- 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つの利用可能なフォーマッターがあります。
- SimpleFormatter:このフォーマッターは、基本情報を含むテキストメッセージを生成します。ConsoleHandlerは、このフォーマッタークラスを使用してログメッセージをコンソールに出力します。
- 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ログAPI
Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example