使用记录器

可以使用 Java™ 日志记录来记录消息和添加跟踪。

关于此任务

Java 提供了日志和跟踪包 java.util.logging,您可以将其用于检测您的应用程序。本主题提供了有关如何使用日志和跟踪包的建议。

过程

  1. 将 WsLevel.DETAIL 级别和更高级别用于消息,而将较低级别用于跟踪。WebSphere® Application Server Extension API (com.ibm.websphere.logging package) 包含 WsLevel 类。
    用于消息:
    WsLevel.FATAL 
    Level.SEVERE 
    Level.WARNING 
    WsLevel.AUDIT 
    Level.INFO 
    Level.CONFIG 
    WsLevel.DETAIL
    用于跟踪:
    Level.FINE 
    Level.FINER 
    Level.FINEST
  2. 使用 logp 方法代替 log 或 logrb 方法。 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 的文档来获取更多信息。以下示例显示定制处理程序:
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();
	}
}

定制过滤器对记录的内容提供可选的辅助控制,这超出了由级别提供的控制。创建定制过滤器的机制是 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());

格式化程序对事件进行格式化。处理程序与一个或多个格式化程序关联。创建定制格式化程序的机制是 IBM Developer Kit Java Technology Edition 提供的 Formatter 类支持。如果您不熟悉 Developer Kit 实现的格式化程序,那么可从各种文本或通过阅读 java.util.logging 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