JavaでHello World
Google
  HOME  |  基礎  |  掲示板  |  ツール |  書籍  |  デザインパターン  |  リンク  |  フィードバック
JavaでHello World > ログ機能編  
メニュー
Home
情報交換掲示板
ツールの部屋
Java関連の書籍
アプリケーション編
Swing編
Swing(イベント)編
Swing(Look&Feel)編
アプレット編
iアプリ編
サーブレット編
サーブレット(Linux)編
サーブレット(web.xml)編
サーブレット(セッション)編
サーブレット(クッキー)編
サーブレット(フィルタ)編
JSP編
JSP(ディレクティブ)編
JSP(アクション)編
JSP(スクリプト)編
JSP(オブジェクト)編
JSP(カスタムタグ)編
JSP(データベース)編
Apache + Tomcat編
Struts編
JDBC編
JDBC(データソース)編
JDBC(MySQL)編
JDBC(PostgreSQL)編
JDBC(トランザクション)編
JavaMail(SMTP)編
JavaMail(POP)編
JNI編
RMI編
RMI(アプレット)編
CORBA編
JNDI編
EJB編
EJB(Entity Bean)編
JMS(PTP)編
JMS(Pub/Sub)編
XML(SAX)編
XML(DOM)編
XSLT編
SOAP編
国際化編
国際化(タイムゾーン)編
国際化(通貨)編
リフレクション編
コレクション編
コレクション(Set)編
コレクション(List)編
コレクション(Map)編
スレッド編
正規表現編
アサーション編
ログ機能編
サウンド編
ファイル入出力編
URL編
ソケット編
データグラム編
HTTP
FTP編
jar編
javadoc編
Ant編
外部コマンド編
プロパティファイル編
システムプロパティ編
Eclipse編
  2002/05/01  田中宏和
Last Update 2003/03/03
ログ機能編
◆ログ機能とは
アプリケーションの動作状況やネットワークでの通信状況などの記録をとる機能のことです。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
 
■書籍
Java関連の書籍

 
  ネットで買えば断然お得!お買い物なら楽天市場
ツールの部屋 - Java関連の書籍 - デザインパターン - 情報交換掲示板 - HOME