ロギングAPIの使用(java.util.logging)AdvertisementロギングAPI
J2SE1.3までのJDKにはロギングコンポーネントが付属していなかったため、プログラマが実装、Jakarta Log4jの利用、System.out.printlnでの出力などの手段でロギングやデバッグを行っていた。J2SE1.4からはjava.util.loggingパッケージが標準で追加された。このクラスを利用すると簡単にロギングを実現することができる。
簡易出力
java.util.logging.Loggerクラスには従来のSystem.out.printlnでの標準出力メソッドを置き換えるためにLogger.globalが用意されている。
サンプルコード
import java.util.logging.*;
public class SimpleOutput {
public static void main(String[] args) {
Logger.global.finest("FINEST");
Logger.global.finer("FINER");
Logger.global.fine("FINE");
Logger.global.config("CONFIG");
Logger.global.info("INFO");
Logger.global.warning("WARNING");
Logger.global.severe("SEVERE");
}
}
実行結果 2004/06/11 19:34:37 mytest.logger.SimpleOutput main 情報: INFO 2004/06/11 19:34:38 mytest.logger.SimpleOutput main 警告: WARNING 2004/06/11 19:34:38 mytest.logger.SimpleOutput main 致命的: SEVERE上記のサンプルコードで使用しているfinest, finer, fine, config, info, warning, severeメソッドはすべてログ出力のためのメソッド。すべてのログメッセージが出力されていない理由は後述する。 ログレベル
ログ出力にはレベル(カテゴリ)が存在する。コード中のログ出力部分でレベルを設定しておき、プログラム実行時にどのレベルまでのログを出力するのかを指定することができる。たとえば開発時と運用時でログ出力レベルを変更することにより、余計なログの出力を抑えることが可能となる。
globalログレベルの定義
globalを使用したログ出力の定義はjdkをインストールしたフォルダ内の/jre/lib/logging.propertiesファイルに指定されている。
一部抜粋 # Default global logging level. # This specifies which kinds of events are logged across # all loggers. For any given facility this global level # can be overriden by a facility specific level # Note that the ConsoleHandler also has a separate level # setting to limit messages printed to the console. .level= INFOこの.level=INFOという記述がログレベルの指定である。 実験 .level= WARNING 実行結果 2004/06/11 19:34:38 mytest.logger.SimpleOutput main 警告: WARNING 2004/06/11 19:34:38 mytest.logger.SimpleOutput main 致命的: SEVEREログレベルにWARNINGを指定したことによってWARNINGより高いレベルのログのみ出力されるようになった。 Loggerクラスを使用したログ出力
前述した簡易ログ出力(Logger.global)は、あくまでも簡易的なログ出力であり、本格的なログ出力やファイル出力に対応させるため
にはLoggerオブジェクトを使用してロギングを行う。
サンプルコード
import java.util.logging.*;
public class UseLogger {
public static void main(String[] args) {
// Loggerオブジェクトの作成
Logger logger = Logger.getLogger("Sample");
// ログ出力
logger.info("ログ出力");
}
}
Loggerオブジェクトを取得するためにはLoggerクラスに定義されているファクトリメソッドを使用する。その際、Loggerオブジェクトを識別するための文字列を引数に設定する。ログレベルの変更
Loggingクラスを使用したログ出力でのログレベルの変更はsetLevelメソッドで行い、引数にはjava.util.logging.Levelクラスに定義されている定数を使用する。
Levelクラスに定義さている定数一覧 Level.FINEST Level.FINER Level.FINE Level.CONFIG Level.INFO Level.WARNING Level.SEVERE Level.ALL すべてのレベル Level.OFF ロギングしない サンプルコード
import java.util.logging.*;
public class UseLogger {
public static void main(String[] args) {
// Loggerオブジェクトの作成
Logger logger = Logger.getLogger("Sample");
// Logレベルの設定
logger.setLevel(Level.ALL);
//logger.setLevel(Level.FINEST);
//logger.setLevel(Level.FINER);
//logger.setLevel(Level.FINE);
//logger.setLevel(Level.CONFIG);
//logger.setLevel(Level.INFO);
//logger.setLevel(Level.WARNING);
//logger.setLevel(Level.SEVERE);
//logger.setLevel(Level.OFF);
// ログ出力
logger.info("ログ出力");
}
}
ログファイル出力
ログファイルの出力にはjava.util.logging.FileHandlerを使用する
FileHandlerのコンストラクタは数種類存在するが、そのうちで基本的なものを紹介。 FileHandler(ファイルパス, ファイルサイズ, ファイル数)ファイルパス:ログファイルを出力するパスを指定する。特殊文字も規程されている。 特殊文字一覧(APIドキュメントより引用)
c:\logfile.log %t/logfile.log %h/logfile%g.log ファイルサイズ:ログファイルの最大サイズを指定する ファイル数:ログファイル数を1以上の正数で指定する。2以上を指定するとログファイルは巡回して使用される。ファイル名に%gを含んでいない場合、ログファイルを識別するために「.数字」という拡張子が付加される。 例 ファイルパスがc:\logfile.logでファイル数が3 c:\logfile.log.0 c:\logfile.log.1 c:\logfile.log.2 ファイルパスがc:\logfile%g.logでファイル数が2 c:\logfile0.log c:\logfile1.log サンプルコード
import java.util.logging.*;
import java.io.*;
public class UseHandler {
public static void main(String[] args) {
try{
// ハンドラオブジェクトの生成
FileHandler handler =
new FileHandler("c:\\logging.log", 1000, 3);
// Loggerオブジェクトの生成
Logger logger = Logger.getLogger("Sample");
// Loggerオブジェクトにハンドラを追加
logger.addHandler(handler);
// ログ出力
logger.info("ログ出力");
}catch(IOException e){
e.printStackTrace();
}
}
}
フォーマットの指定
ログ出力のフォーマットの指定はjava.util.logging.Formatterクラスを拡張して行う。詳細はAPIドキュメントを参照。
java.util.loggingパッケージには次の2つのフォーマット定義クラスが用意されている。
フォーマットの指定はFileHandlerクラスに対してsetFormatterメソッドを使用して行う。デフォルトではXMLFormatterが使用される。 サンプルコード
import java.util.logging.*;
import java.io.*;
public class UseHandler {
public static void main(String[] args) {
try{
// ハンドラオブジェクトの生成
FileHandler handler =
new FileHandler("c:\\logging%g.log", 1000, 3);
// 出力フォーマットの指定
handler.setFormatter(new SimpleFormatter());
//handler.setFormatter(new XMLFormatter());
// Loggerオブジェクトの生成
Logger logger = Logger.getLogger("Sample");
// Loggerオブジェクトにハンドラを追加
logger.addHandler(handler);
// ログ出力
logger.info("ログ出力");
}catch(IOException e){
e.printStackTrace();
}
}
}
SimpleFormatterを使用した場合のログファイルの内容 2004/06/11 20:08:27 mytest.logger.UseHandler main 情報: ログ出力 XMLFormatterを使用した場合のログファイルの内容 <?xml version="1.0" encoding="MS932" standalone="no"?> <!DOCTYPE log SYSTEM "logger.dtd"> <log> <record> <date>2004-06-11T11:20:25</date> <millis>1086920425711</millis> <sequence>0</sequence> <logger>Sample</logger> <level>INFO</level> <class>mytest.logger.UseHandler</class> <method>main</method> <thread>10</thread> <message>ログ出力</message> </record> </log> プロパティファイルの使用
プロパティファイルを使用してログの定義を行うことによって、プログラム内でログの形式を指定する必要がなくなる。
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 Advertisement |
ショートカット・634・このカテゴリのトップページに戻る ・634labs UIコレクションギャラリー サイト検索Y!ログール |