2000年3月28日星期二

ログ機能編

◆ログ機能とは
アプリケーションの動作状況やネットワークでの通信状況などの記録をとる機能のことです。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
 

没有评论:

发表评论