ロガーの使用

Java™ ロギングを使用してメッセージのログを記録し、トレースを追加します。

このタスクについて

Java はアプリケーションを装備するのに使用できるログおよびトレース・パッケージの java.util.logging を提供します。このトピックは、ログおよびトレース・パッケージの使用方法に関する推奨事項について説明します。

手順

  1. メッセージに対しては WsLevel.DETAIL 以上のレベルを使用し、トレースに対してはそれより低いレベルを使用します。WebSphere® Application Server Extension API (com.ibm.websphere.logging パッケージ) に WsLevel クラス が含まれています。
    メッセージに対しては、以下を使用します。
    WsLevel.FATAL 
    Level.SEVERE 
    Level.WARNING 
    WsLevel.AUDIT 
    Level.INFO 
    Level.CONFIG 
    WsLevel.DETAIL
    トレースに対しては、以下を使用します。
    Level.FINE 
    Level.FINER 
    Level.FINEST
  2. log または logrb メソッドの代わりに logp メソッドを使用します。 logp メソッドはクラス名およびメソッド名のパラメーターを受け入れます。 通常、log および logrb メソッドは、この情報の推測を試みますが、パフォーマンスの低下が非常に大きくなります。一般に、 logp メソッドは、log メソッドまたは logrb メソッドほどパフォーマンスに影響を与えません。
  3. logrb メソッドは使用しないでください。 このメソッドは、リソース・バンドルの非効率なキャッシングをもたらし、パフォーマンスの低下につながります。
  4. ログに記録されないロギング呼び出しで、データを作成しないようにするには、isLoggable メソッドを使用します。 以下に例を示します。
    if (logger.isLoggable(Level.FINEST)) {
     		String s = dumpComponentState();	// some expensive to compute method
     		logger.logp(Level.FINEST, className, methodName, "componentX state dump:¥n{0}", s);
     }

ローカライズされたメッセージ

以下の例は、ローカライズされたメッセージに適用されます。
// note - generally avoid use of FINE, FINER, FINEST levels for messages to be consistent with
// WebSphere Application Server

String componentName = "com.ibm.websphere.componentX";
String resourceBundleName = "com.ibm.websphere.componentX.Messages";
Logger logger = Logger.getLogger(componentName, resourceBundleName);

// "Convenience" methods - not generally recommended due to lack of class 
/ method names
//   - cannot specify message substitution parameters
//   - cannot  specify class and method names
if (logger.isLoggable(Level.SEVERE))
		logger.severe("MSG_KEY_01");

if (logger.isLoggable(Level.WARNING))
		logger.warning("MSG_KEY_01");

if (logger.isLoggable(Level.INFO))
		logger.info("MSG_KEY_01");

if (logger.isLoggable(Level.CONFIG))
		logger.config("MSG_KEY_01");


// log methods are not generally used due to lack of class and method
names
//   - enable use of WebSphere Application Server-specific levels
//   - enable use of message substitution parameters
//   - cannot specify class and method names
if (logger.isLoggable(WsLevel.FATAL))
		logger.log(WsLevel.FATAL, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.SEVERE))
		logger.log(Level.SEVERE, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.WARNING))
		logger.log(Level.WARNING, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(WsLevel.AUDIT))
		logger.log(WsLevel.AUDIT, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.INFO))
		logger.log(Level.INFO, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.CONFIG))
		logger.log(Level.CONFIG, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(WsLevel.DETAIL))
		logger.log(WsLevel.DETAIL, "MSG_KEY_01", "parameter 1");


// logp methods are the way to log
//   - enable use of WebSphere Application Server-specific levels
//   - enable use of message substitution parameters
//   - enable use of class and method names
if (logger.isLoggable(WsLevel.FATAL))
		logger.logp(WsLevel.FATAL, className, methodName, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.SEVERE))
		logger.logp(Level.SEVERE, className, methodName, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.WARNING))
		logger.logp(Level.WARNING, className, methodName, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(WsLevel.AUDIT))
		logger.logp(WsLevel.AUDIT, className, methodName, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.INFO))
		logger.logp(Level.INFO, className, methodName, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.CONFIG))
		logger.logp(Level.CONFIG, className, methodName, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(WsLevel.DETAIL))
		logger.logp(WsLevel.DETAIL, className, methodName, "MSG_KEY_01", "parameter 1");


// logrb methods are not generally used due to diminished performance
of switching resource bundles dynamically
//   - enable use of WebSphere Application Server-specific levels
//   - enable use of message substitution parameters
//   - enable use of class and method names
String resourceBundleNameSpecial = "com.ibm.websphere.componentX.MessagesSpecial";

if (logger.isLoggable(WsLevel.FATAL))
		logger.logrb(WsLevel.FATAL, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.SEVERE))
		logger.logrb(Level.SEVERE, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.WARNING))
		logger.logrb(Level.WARNING, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(WsLevel.AUDIT))
		logger.logrb(WsLevel.AUDIT, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.INFO))
		logger.logrb(Level.INFO, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(Level.CONFIG))
		logger.logrb(Level.CONFIG, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");

if (logger.isLoggable(WsLevel.DETAIL))
		logger.logrb(WsLevel.DETAIL, className, methodName, resourceBundleNameSpecial, "MSG_KEY_01", "parameter 1");
トレースまたはローカライズされていない内容の場合は、以下の例が適用されます。
// note - generally avoid use of FATAL, SEVERE, WARNING, AUDIT,
// INFO, CONFIG, DETAIL levels for trace 
// to be consistent with WebSphere Application Server

String componentName = "com.ibm.websphere.componentX";
Logger logger = Logger.getLogger(componentName);

// Entering / Exiting methods are used for non trivial methods
if (logger.isLoggable(Level.FINER))
		logger.entering(className, methodName);
	
if (logger.isLoggable(Level.FINER))
		logger.entering(className, methodName, "method param1");

if (logger.isLoggable(Level.FINER))
		logger.exiting(className, methodName);

if (logger.isLoggable(Level.FINER))
		logger.exiting(className, methodName, "method result");


// Throwing method is not generally used due to lack of message - use
logp with a throwable parameter instead
if (logger.isLoggable(Level.FINER))
		logger.throwing(className, methodName, throwable);


// Convenience methods are not generally used due to lack of class
/ method names
//   - cannot specify message substitution parameters
//   - cannot specify class and method names
if (logger.isLoggable(Level.FINE))
		logger.fine("This is my trace");

if (logger.isLoggable(Level.FINER))
		logger.finer("This is my trace");

if (logger.isLoggable(Level.FINEST))
		logger.finest("This is my trace");


// log methods are not generally used due to lack of class and
method names
//   - enable use of WebSphere Application Server-specific levels
//   - enable use of message substitution parameters
//   - cannot specify class and method names
if (logger.isLoggable(Level.FINE))
		logger.log(Level.FINE, "This is my trace", "parameter 1");

if (logger.isLoggable(Level.FINER))
		logger.log(Level.FINER, "This is my trace", "parameter 1");

if (logger.isLoggable(Level.FINEST))
		logger.log(Level.FINEST, "This is my trace", "parameter 1");


// logp methods are the recommended way to log
//   - enable use of WebSphere Application Server-specific levels
//   - enable use of message substitution parameters
//   - enable use of class and method names
if (logger.isLoggable(Level.FINE))
		logger.logp(Level.FINE, className, methodName, "This is my trace", "parameter 1");

if (logger.isLoggable(Level.FINER))
		logger.logp(Level.FINER, className, methodName, "This is my trace", "parameter 1");

if (logger.isLoggable(Level.FINEST))
		logger.logp(Level.FINEST, className, methodName, "This is my trace", "parameter 1");


// logrb methods are not applicable for trace logging because no localization
is involved
統合されたロギングに参加するよりはむしろ、 ログ・レコードをユーザー独自のログ・ハンドラーに伝搬したい場合があります。 スタンドアロンのログ・ハンドラーを使用するには、アプリケーション で useParentHandlers フラグを false に設定 します。カスタマー・ハンドラーを作成するためのメカニズムは、 IBM® Developer Kit, Java Technology Edition によって提供される Handler クラスのサポートです。Developer Kit によって実装されるハンドラーについて知識がない場合は、各種のテキストから、あるいは java.util.logging API の API 文書を読むことで、詳細な情報を得ることができます。 以下の例は、カスタム・ハンドラーを示しています。
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.logging.Handler;
import java.util.logging.LogRecord;

/**
 * MyCustomHandler outputs contents to a specified file
 */
public class MyCustomHandler extends Handler {

		FileOutputStream fileOutputStream;
		PrintWriter printWriter;

		public MyCustomHandler(String filename) {
		super();

				// check input parameter
				if (filename == null || filename == "")
						filename = "mylogfile.txt";
		
		try {
			// initialize the file 
						fileOutputStream = new FileOutputStream(filename);
						printWriter = new PrintWriter(fileOutputStream);
			 			 setFormatter(new SimpleFormatter());
		}
		catch (Exception e) {
						// implement exception handling...
		}
	}

		/* (non-API documentation)
	 	 * @see java.util.logging.Handler#publish(java.util.logging.LogRecord)
	 */
		public void publish(LogRecord record) {
				// ensure that this log record should be logged by this Handler
				if (!isLoggable(record))
			return;
		
				// Output the formatted data to the file
				printWriter.println(getFormatter().format(record));
	}

		/* (non-API documentation)
	 	 * @see java.util.logging.Handler#flush()
	 */
		public void flush() {
				printWriter.flush();
	}

		/* (non-API documentation)
	 	 * @see java.util.logging.Handler#close()
	 */
		public void close() throws SecurityException {
				printWriter.close();
	}
}

カスタム・フィルターを使用すると、ログへの記録内容に関して、レベルで指定された制御範囲を越えて、 オプションの 2 次制御を行うことができます。カスタム・フィルターを作成するメカニズムは、IBM Developer Kit, Java Technology Edition に用意されている Filter インターフェースのサポートです。Developer Kit によって実装されるフィルターについて知識がない場合は、各種のテキストから、あるいは java.util.logging API の API 文書を読むことで、詳細な情報を得ることができます。

以下の例は、カスタム・フィルターを示しています。

/**
 * This class filters out all log messages starting with SECJ022E, SECJ0373E, or SECJ0350E.
 */
import java.util.logging.Filter;
import java.util.logging.Handler;
import java.util.logging.Logger;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {
		public boolean isLoggable(LogRecord lr) {
				String msg = lr.getMessage();
				if (msg.startsWith("SECJ0222E") || msg.startsWith("SECJ0373E") || msg.startsWith("SECJ0350E")) {
			return false;
		}
		return true;
	}
}

//This code will register the log filter with the root Logger's handlers
// (including the WAS system logs):
...
Logger rootLogger = Logger.getLogger("");
rootLogger.setFilter(new MyFilter());

フォーマッターは、イベントをフォーマットします。 ハンドラーは、1 つ以上のフォーマッターに関連付けられます。 カスタム・フォーマッターを作成するメカニズムは、IBM Developer Kit, Java Technology Edition に用意されている Formatter クラスのサポートです。Developer Kit によって実装されるフォーマッターについて知識がない場合は、各種のテキストから、あるいは java.util.logging API の API 文書を読むことで、詳細な情報を得ることができます。

以下の例は、カスタム・フォーマッターを示しています。

import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

/**
 * MyCustomFormatter formats the LogRecord as follows:
 * date   level   localized message with parameters 
 */
public class MyCustomFormatter extends Formatter {

		public MyCustomFormatter() {
		super();
	}

		public String format(LogRecord record) {
		
				// Create a StringBuffer to contain the formatted record
				// start with the date.
				StringBuffer sb = new StringBuffer();
		
				// Get the date from the LogRecord and add it to the buffer
				Date date = new Date(record.getMillis());
				sb.append(date.toString());
		sb.append(" ");
		
				// Get the level name and add it to the buffer
				sb.append(record.getLevel().getName());
		sb.append(" ");
		 
				// Get the formatted message (includes localization 
				// and substitution of paramters) and add it to the buffer
				sb.append(formatMessage(record));
				sb.append("¥n");

		return sb.toString();
	}
}

カスタムのハンドラー、フィルター、およびフォーマッターを追加すると、デフォルトの WebSphere Application Server ロギング・インフラストラクチャーの構成によって実現できる環境を超えて、ロギング環境をカスタマイズできます。以下の例は、要求を処理するために、新規ハンドラーをロガーの com.myCompany サブツリーへ追加する方法を示したものです (ロガー階層の構成を参照)。 この例の main メソッドでは、新規に構成されたロガーの使用方法に ついて述べます。

import java.util.Vector;
import java.util.logging.Filter;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MyCustomLogging {

		public MyCustomLogging() {
		super();
	}

		public static void initializeLogging() {
		
				// Get the logger that you want to attach a custom Handler to
				String defaultResourceBundleName = "com.myCompany.Messages";
				Logger logger = Logger.getLogger("com.myCompany", defaultResourceBundleName);
		
				// Set up a custom Handler (see MyCustomHandler example)
				Handler handler = new MyCustomHandler("MyOutputFile.log");
		
				// Set up a custom Filter (see MyCustomFilter example)
				Vector acceptableLevels = new Vector();
				acceptableLevels.add(Level.INFO);
				acceptableLevels.add(Level.SEVERE);
				Filter filter = new MyCustomFilter(acceptableLevels);
		
				// Set up a custom Formatter (see MyCustomFormatter example)
				Formatter formatter = new MyCustomFormatter();

				// Connect the filter and formatter to the handler
				handler.setFilter(filter);
				handler.setFormatter(formatter);
		
				// Connect the handler to the logger
				logger.addHandler(handler);
		
				// avoid sending events logged to com.myCompany showing up in WebSphere
				// Application Server logs
				logger.setUseParentHandlers(false);
				
	}

	public static void main(String[] args) {
				initializeLogging();
		
				Logger logger = Logger.getLogger("com.myCompany");
		
				logger.info("This is a test INFO message");
				logger.warning("This is a test WARNING message");
				logger.logp(Level.SEVERE, "MyCustomLogging", "main", "This is a test SEVERE message");
	}
}
上記のプログラムが実行されると、その出力は MyOutputFile.log ファイルに書き込まれます。ログ内容は、予想されるログ・ファイルの中にあり、カスタム・ハンドラーによって制御されるため、カスタム・フォーマッターでの定義どおりにフォーマットされます。 警告メッセージは、カスタム・フィルターの構成における指定に従って、フィルターに掛けられます。 出力は以下のとおりです。
C:¥>type MyOutputFile.log
Sat Sep 04 11:21:19 EDT 2004 INFO This is a test INFO message
Sat Sep 04 11:21:19 EDT 2004 SEVERE This is a test SEVERE message

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=ttrb_createloginstance
ファイル名:ttrb_createloginstance.html