| ◆ログ機能とは |
アプリケーションの動作状況やネットワークでの通信状況などの記録をとる機能のことです。J2SE
v1.4のログ機能を用いることによって、Javaアプリケーションでのセキュリティー、バグ、パフォーマンスなどの情報を出力することができます。 |
| ◆ここでの環境 |
| OS | Windows 2000 |
| J2SE SDK | 1.4.0 |
|
|
|
| ◆Java実行環境の構築 |
| アプリケーション編を参考にしてJava実行環境を構築してください。 |
| ◆java.util.loggingパッケージ |
| ログ機能はjava.util.loggingパッケージに入っています。 |
| Loggerクラス |
| アプリケーションがログを出力する時に使用するクラス |
| Handlerクラス |
| Loggerからログのメッセージを取得して出力するクラス |
| Handlerクラスにはログの出力先に応じて使い分ける以下のようなサブクラスが存在します |
Handlerクラス
のサブクラス | 説明 |
| StreamHandler | 出力ストリームにログを書き込む場合に使用 |
| ConsoleHandler | 標準エラー出力にログを書き込む場合に使用 |
| FileHandler | ファイルにログを書き込む場合に使用 |
| SocketHandler | ソケットにログを書き込む場合に使用 |
| MemoryHandler | メモリ上にログを書き込む場合に使用 |
|
|
| ◆ログの出力レベル |
| ログにはログの重要度を表すレベルがあります。SEVEREが最も高くFINESTが最も低くなります。ログの出力時にログのレベルを設定しておくとそのレベル以上のログのみ出力されるようになります。レベルはLevelクラスの定数で提供されています。下の定数以外に「OFF」と「ALL」があり、ログのレベルをOFFに設定するとログが出力されなくなり、ALLを設定するとすべてのログが出力されるようになります。 |
| 優先順位 | 出力レベル | 説明 |
| 高 | SEVERE | 致命的なエラーが発生した場合 |
| | WARNING | 起こりうる問題が発生した場合 |
| | INFO | 重要な情報を出力する場合 |
| | CONFIG | 設定情報を出力する場合 |
| | FINE | デバック情報を出力する場合 |
| | FINER | より詳細なデバック情報を出力する場合 |
| 低 | FINEST | もっとも詳細なデバック情報を出力する場合 |
|
| ◆ログのフォーマット |
| ログのフォーマットはFormatterクラスで行います。HandlerクラスのsetFomatterメソッドでFormatterクラスを設定します。 |
| 用意されているFormatterクラス |
| Formatterクラス | 説明 |
| SimpleFormatter | テキスト形式でフォーマットします |
| XMLFormatter | XML形式でフォーマットします |
|
| なお、独自の形式で出力したい場合Formatterクラスを継承して独自のFormatterクラスを作成して使用するこもできます。 |
|
| ◆Javaソースコード |
| ここではhelloworldlog.txtというファイルにログを出力するプログラムを作りたいと思います。 |
| HelloWorldLoggin.java(ここからダウンロード) |
import java.util.logging.*;
public class HelloWorldLogging {
public static void main(String argv[]) {
try {
// javahello.loggingという名前のLoggerを生成
Logger logger = Logger.getLogger("javahello.logging");
// FileHandlerを生成
FileHandler fh = new FileHandler("helloworldlog.txt");
// Formatterを設定します
fh.setFormatter(new SimpleFormatter());
// ログの出力先を追加
logger.addHandler(fh);
// ログの出力レベルを設定(ここではすべて出力するように設定)
logger.setLevel(Level.ALL);
// ログ出力
logger.log(Level.INFO , "ログ機能でHello World");
} catch (Exception e) {
e.printStackTrace();
}
}
} |
|
|
| ◆コンパイルと実行 |
| コマンドプロンプト |
C:\作業フォルダ\JavaHello>javac
HelloWorldLogging.java C:\作業フォルダ\JavaHello>java
HelloWorldLogging
2002/02/01 11:21:22 HelloWorldLogging main
情報: ログ機能でHello World C:\作業フォルダ\JavaHello> |
|
| おおおおお!メッセージが表示された! |
| ログファイルに出力されているか確認してみましょう。実行したフォルダに「javahellolog.txt」ファイルができているはずです。 |
| javahellolog.txt |
2002/02/01 11:21:22 HelloWorldLogging main
情報: ログ機能でHello World |
|
| おおおおお!ログが出力されていますね! |
| |
| ◆独自のフォーマット形式で出力 |
| Formatterクラスを作ってフォーマット形式を指定してみます。 |
| ■Formatterクラスの作成 |
| HelloWorldFormatter.java(ここからダウンロード) |
import java.util.logging.*;
import java.util.*;
import java.text.*;
class HelloWorldFormatter extends Formatter {
/**
* 指定されたログレコードをフォーマットし、フォーマットされた文字列を返します
*/
public String format(LogRecord rec) {
StringBuffer buf = new StringBuffer();
buf.append("レベル:");
buf.append(rec.getLevel());
buf.append("\n");
buf.append("ログ:");
buf.append(formatMessage(rec));
buf.append("\n");
return buf.toString();
}
/**
* フォーマットされたレコードのセットのヘッダ文字列を返します
*/
public String getHead(Handler h) {
DateFormat df = DateFormat.getDateInstance(DateFormat.FULL, Locale.JAPAN);
return "[" + df.format(new Date()) + "]\n";
}
/**
* フォーマットされたレコードセットの末尾の文字列を返します
*/
public String getTail(Handler h) {
return "";
}
} |
|
|
| ■ログを出力するソース |
| 上で作成したFormatterクラスを設定するようにログを出力するソースコードを編集 |
| HelloWorldFormatLogging.java(ここからダウンロード) |
import java.util.logging.*;
public class HelloWorldFormatLogging {
public static void main(String argv[]) {
try {
// javahello.loggingという名前のLoggerを生成
Logger logger = Logger.getLogger("javahello.logging");
// FileHandlerを生成
FileHandler fh = new FileHandler("helloworldlog.txt");
// Formatterを設定します
fh.setFormatter(new HelloWorldFormatter());
// ログの出力先を追加
logger.addHandler(fh);
// ログの出力レベルを設定(ここではすべて出力するように設定)
logger.setLevel(Level.ALL);
// ログ出力
logger.log(Level.INFO , "ログ機能でHello World");
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
|
|
|
| ■コンパイルと実行 |
| コマンドプロンプト |
C:\作業フォルダ\JavaHello>javac
HelloWorldFormatLogging.java HelloWorldFormatter.java
C:\作業フォルダ\JavaHello>java HelloWorldFormatLogging
2002/11/22 20:39:39 HelloWorldFormatLogging main
情報: ログ機能でHello World
C:\作業フォルダ\JavaHello> |
|
| ■ログの確認 |
| ログが出力されているか確認してみましょう。 |
| javahellolog.txt |
[2002年11月22日 (金曜日)]
レベル:INFO
ログ:ログ機能でHello World |
|
| おおおお!フォーマットされて出力されていますね! |
| |
| ◆ログ出力の設定を外部ファイルで設定する |
| ■logging.propertesファイル |
| ログ出力のデフォルトの設定は%JAVA_HOME%\jre\lib\logging.propertiesファイルで設定されている値が使用されます。このファイルを編集することでログ出力に関する設定を変更することができます。 |
| logging.properties |
############################################################
# Default Logging Configuration File
#
# You can use a different file by specifying a filename
# with the java.util.logging.config.file system property.
# For example java -Djava.util.logging.config.file=myfile
############################################################
############################################################
# Global properties
############################################################ # "handlers" specifies a comma separated
list of log Handler
# classes. These handlers will be installed during VM
startup.
# Note that these classes must be on the system classpath.
# By default we only configure a ConsoleHandler, which
will only
# show messages at the INFO and above levels.
handlers= java.util.logging.ConsoleHandler # To also add the FileHandler, use the following line
instead.
#handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler # 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 ############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################ # default file output is in user's home directory.
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 # Limit the message that are printed on the console
to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################
# For example, set the com.xyz.foo logger to only log
SEVERE
# messages:
com.xyz.foo.level = SEVERE
|
|
|
|
| ■設定例 |
| (例1) デフォルトだとConsoleHandlerのみ設定されているので、ファイルに出力するようにFileHandleも設定します。 |
#handlers= java.util.logging.ConsoleHandler
handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler |
|
| |
| (例2) ファイルハンドラのプロパティを設定できます。デフォルトでは以下のようになっています。 |
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 |
|
| <プロパティの説明> |
| キー | 説明 |
| java.util.logging.FileHandler.pattern | 出力ファイルの名前付けのパターン
(実行時に置き換えられる文字列)
"/" ローカルパス名の区切り文字
"%t" システムの一時ディレクトリ
"%h" user.home
システムプロパティの値
"%g" ログのローテーションを識別する生成番号
"%u" 重複を解決する一意の番号
"%%" 単一のパーセント符号
% に変換 |
| java.util.logging.FileHandler.limit | 任意の 1 つのファイルに書き込む最大バイト数 |
| java.util.logging.FileHandler.count | 使用するファイル数 |
| java.util.logging.FileHandler.formatter | 使用するFormatter |
|
| |
| (例3) javahello.loggingという名前のロガーのデフォルトの出力レベルをSEVEREに設定する場合以下の行をlogging.propertiesファイルに追加します。 |
| javahello.logging.level = SEVERE |
|
| |
没有评论:
发表评论