Java Logging API - Tutorial
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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.