로거 사용

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에서 제공하는 핸들러 클래스 지원입니다. 개발자 킷에서 구현된 핸들러에 대해 잘 알지 못하는 경우 다양한 텍스트로부터 또는 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();
	}
}

사용자 정의 필터는 레벨에서 제공하는 제어 외에도 로그되는 내용에 대한 선택적 보조 제어를 제공합니다. 사용자 정의 필터를 작성하기 위한 메커니즘은 IBM Developer Kit, Java Technology Edition에서 제공하는 필터 인터페이스 지원입니다. 개발자 킷에서 구현된 필터에 대해 잘 알지 못하는 경우 다양한 텍스트로부터 또는 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 클래스 지원입니다. 개발자 킷에서 구현된 포맷터에 대해 잘 알지 못하는 경우 다양한 텍스트로부터 또는 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 서브트리에 요청을 처리할 새 핸들러는 추가하는 방법을 보여줍니다(로거 계층 구조 구성 참조). 이 샘플의 기본 메소드는 새로 구성된 로거를 사용하는 방법의 예를 제공합니다.

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