Java Logging API - Tutorial

원본 주소:http://www.vogella.com/articles/Logging/article.html
Java Logging
본 고 는 JDK 의 Logging API 가 자바 프로그램 에서 사용 되 는 것 을 소개 하고 그 뒤에 HTML logger 를 만 드 는 예 를 추가 할 것 이다.
목차
1. 개술
1.1. 자바 의 Logging
1.2. logger 만 들 기
1.3. 로그 레벨
1.4. Handler
1.5. Formatter
1.6. Log Manager
1.7. 최선 의 실천
2. 본보기
3. 감사
4. 문제 와 토론
5. 관련 글
1. Overview
1.1. 자바 의 Logging
JDK 에는 자바 로 깅 API 가 있 습 니 다.logger 를 통 해 로그 정 보 를 파일 에 집중 하여 오 류 를 보고 할 수 있 을 뿐만 아니 라 로그 에 보조 정 보 를 추가 할 수 있 습 니 다.이 Logging API 는 사용자 정의 가 가능 하고 유연 합 니 다.
1.2. logger 만 들 기
패키지 java. util. logging 은 로그 기능 을 제공 합 니 다. 아래 코드 와 유사 한 logger 를 만 들 수 있 습 니 다.
import java.util.logging.Logger;

private final static Logger LOGGER = Logger.getLogger(MyClass.class .getName());

1.3. Level
Log 의 등급 은 문제 의 심각 성 을 반영 합 니 다.Level 클래스 는 로그 에 어떤 정 보 를 기록 할 지 결정 하 는 데 사 용 됩 니 다.다음은 심각 한 내림차 순 으로 배 열 된 Log Level 입 니 다.
SEVERE (highest)
WARNING
INFO
CONFIG
FINE
FINER
FINEST
이 밖 에 도 로 그 를 닫 거나 모든 로 그 를 열 수 있 는 OFF 나 ALL 두 level 을 사용 할 수 있 습 니 다.
다음 줄 코드 는 logger 를 기록 INFO 단계 로 설정 합 니 다.
LOGGER.setLevel(Level.INFO); 

1.4. Handler
각 logger 는 여러 개의 Handler 를 설정 할 수 있 습 니 다.
Handler 는 logger 의 정 보 를 받 아 적절 한 형식 으로 적절 한 곳 에 보 내 는 역할 을 한다.
하나의 Handler 는 setLevel (Level. OFF) 로 닫 고 setLevel (...) 로 열 수 있 습 니 다.
JDK 는 다음 과 같은 몇 가지 표준 handler 를 제공 합 니 다.
Console Handler: log 정 보 를 Console 에 쓰기 FileHandler: 로그 정 보 를 파일 에 쓰기 INFO (INFO 포함) 를 초과 한 정 보 는 자동 으로 Console 에 기 록 됩 니 다.
1.5. Formatter
Handler 마다 출력 을 formatter 로 설정 할 수 있 습 니 다.
기 존 formatter:
Simple Formatter 는 모든 로그 정 보 를 텍스트 형식 으로 편성 합 니 다 XML 형식의 로그 정보 생 성 Formatter 를 사용자 정의 할 수 있 습 니 다. 아래 예제 Formatter 는 로그 정 보 를 html 형식 으로 포장 할 수 있 습 니 다.
package logging;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;

//This custom formatter formats parts of a log record to a single line
class MyHtmlFormatter extends Formatter
{
	// This method is called for every log records
	public String format(LogRecord rec)
	{
		StringBuffer buf = new StringBuffer(1000);
		// Bold any levels >= WARNING
		buf.append("<tr>");
		buf.append("<td>");

		if (rec.getLevel().intValue() >= Level.WARNING.intValue())
		{
			buf.append("<b>");
			buf.append(rec.getLevel());
			buf.append("</b>");
		} else
		{
			buf.append(rec.getLevel());
		}
		buf.append("</td>");
		buf.append("<td>");
		buf.append(calcDate(rec.getMillis()));
		buf.append(' ');
		buf.append(formatMessage(rec));
		buf.append('
'); buf.append("<td>"); buf.append("</tr>
"); return buf.toString(); } private String calcDate(long millisecs) { SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm"); Date resultdate = new Date(millisecs); return date_format.format(resultdate); } // This method is called just after the handler using this // formatter is created public String getHead(Handler h) { return "<HTML>
<HEAD>
" + (new Date()) + "
</HEAD>
<BODY>
<PRE>
" + "<table border>
" + "<tr><th>Time</th><th>Log Message</th></tr>
"; } // This method is called just after the handler using this // formatter is closed public String getTail(Handler h) { return "</table>
</PRE></BODY>
</HTML>
"; } }

1.6. Log Manager
log manager 의 직책 은 logger 를 만 들 고 관리 하 며 log 설정 을 유지 하 는 것 입 니 다.
LogManager. setLevel (String name, Level level) 방법 을 사용 하면 가방 이나 패키지 에 logging level 을 설정 할 수 있 습 니 다.예 를 들 어 모든 logger 의 logging level 을 Level. FINE 로 설정 할 수 있 습 니 다.
LogManager.getLogManager().setLevel("logging", Level.FINE)

1.7. Best Practices
logged 된 클래스 의 이름 을 logger 라 고 부 르 는 것 은 좋 은 방법 입 니 다. 이 방법 은 프로그래머 가 로 그 를 더 잘 보고 관리 할 수 있 도록 하 는 동시에 Logging API 가 추천 하 는 방식 이기 도 합 니 다.
2. 예시
당신 은 프로젝트 에서 "
de. vogella. logger 에서 이 예 를 찾 았 습 니 다:
자신의 formatter 만 들 기:
package logging;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;

//This custom formatter formats parts of a log record to a single line
class MyHtmlFormatter extends Formatter
{
	// This method is called for every log records
	public String format(LogRecord rec)
	{
		StringBuffer buf = new StringBuffer(1000);
		// Bold any levels >= WARNING
		buf.append("<tr>");
		buf.append("<td>");

		if (rec.getLevel().intValue() >= Level.WARNING.intValue())
		{
			buf.append("<b>");
			buf.append(rec.getLevel());
			buf.append("</b>");
		} else
		{
			buf.append(rec.getLevel());
		}
		buf.append("</td>");
		buf.append("<td>");
		buf.append(calcDate(rec.getMillis()));
		buf.append(' ');
		buf.append(formatMessage(rec));
		buf.append('
'); buf.append("<td>"); buf.append("</tr>
"); return buf.toString(); } private String calcDate(long millisecs) { SimpleDateFormat date_format = new SimpleDateFormat("MMM dd,yyyy HH:mm"); Date resultdate = new Date(millisecs); return date_format.format(resultdate); } // This method is called just after the handler using this // formatter is created public String getHead(Handler h) { return "<HTML>
<HEAD>
" + (new Date()) + "
</HEAD>
<BODY>
<PRE>
" + "<table border>
" + "<tr><th>Time</th><th>Log Message</th></tr>
"; } // This method is called just after the handler using this // formatter is closed public String getTail(Handler h) { return "</table>
</PRE></BODY>
</HTML>
"; } }
logger 초기 화
package logging;

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class MyLogger {
	static private FileHandler fileTxt;
	static private SimpleFormatter formatterTxt;

	static private FileHandler fileHTML;
	static private Formatter formatterHTML;

	static public void setup() throws IOException {
		// Create Logger
		Logger logger = Logger.getLogger("");
		logger.setLevel(Level.INFO);
		fileTxt = new FileHandler("Logging.txt");
		fileHTML = new FileHandler("Logging.html");

		// Create txt Formatter
		formatterTxt = new SimpleFormatter();
		fileTxt.setFormatter(formatterTxt);
		logger.addHandler(fileTxt);

		// Create HTML Formatter
		formatterHTML = new MyHtmlFormatter();
		fileHTML.setFormatter(formatterHTML);
		logger.addHandler(fileHTML);
	}
}
logger 사용 하기
package logging;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class UseLogger {
	// Always use the classname, this way you can refactor
	private final static Logger LOGGER = Logger.getLogger(UseLogger.class
			.getName());

	public void writeLog() {
		// Set the LogLevel to Severe, only severe Messages will be written
		LOGGER.setLevel(Level.SEVERE);
		LOGGER.severe("Info Log");
		LOGGER.warning("Info Log");
		LOGGER.info("Info Log");
		LOGGER.finest("Really not important");

		// Set the LogLevel to Info, severe, warning and info will be written
		// Finest is still not written
		LOGGER.setLevel(Level.INFO);
		LOGGER.severe("Info Log");
		LOGGER.warning("Info Log");
		LOGGER.info("Info Log");
		LOGGER.finest("Really not important");
	}

	public static void main(String[] args) {
		UseLogger logger = new UseLogger();
		try {
			MyLogger.setup();
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("Problems with creating the log files");
		}
		logger.writeLog();
	}
}

좋은 웹페이지 즐겨찾기