오늘은 자바의 Logger를 살펴보겠습니다. 자바 Logger는 자바 프로그래밍에서 로깅을 제공합니다.
Java의 Logger
Java 로깅 API는 1.4에서 소개되었으며 애플리케이션 메시지를 기록하기 위해 Java 로깅 API를 사용할 수 있습니다. 이 자바 로깅 튜토리얼에서는 Java Logger의 기본 기능을 배웁니다. 또한 다양한 로깅 레벨, 로깅 핸들러, 포매터, 필터, 로그 관리자 및 로깅 구성의 Java Logger 예제를 살펴볼 것입니다.
자바 Logger
java.util.logging.Logger
는 자바 로깅 API에서 애플리케이션 메시지를 기록하는 데 사용되는 클래스입니다. 매우 간단한 한 줄의 코드로 자바 Logger를 생성할 수 있습니다;
Logger logger = Logger.getLogger(MyClass.class.getName());
Java 로깅 레벨
java.util.logging.Level
은 자바 로깅의 다른 수준을 정의합니다. 자바에서 로깅에는 일곱 가지 수준이 있습니다.
- SEVERE (가장 높음)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
두 가지 다른 로깅 수준이 있습니다. OFF는 모든 로깅을 끕니다. ALL은 모든 메시지를 기록합니다. 다음 코드를 사용하여 로거 수준을 설정할 수 있습니다:
logger.setLevel(Level.FINE);
로거 수준보다 크거나 같은 모든 수준에 대해 로그가 생성됩니다. 예를 들어, 로거 수준이 INFO로 설정된 경우, INFO, WARNING 및 SEVERE 로깅 메시지에 대해 로그가 생성됩니다.
Java 로깅 핸들러
자바 로거에 여러 핸들러를 추가할 수 있으며, 메시지를 로깅할 때마다 각 핸들러가 그것을 처리합니다. Java 로깅 API에서 제공하는 두 가지 기본 핸들러가 있습니다.
- ConsoleHandler: 이 핸들러는 모든 로깅 메시지를 콘솔에 작성합니다.
- FileHandler: 이 핸들러는 모든 로깅 메시지를 XML 형식으로 파일에 작성합니다.
우리는 특정 작업을 수행하기 위해 자체 사용자 정의 핸들러도 만들 수 있습니다. 사용자 정의 Handler 클래스를 만들려면 java.util.logging.Handler 클래스 또는 StreamHandler, SocketHandler 등의 하위 클래스 중 하나를 확장해야 합니다. 다음은 사용자 정의 java 로깅 핸들러의 예입니다:
package com.journaldev.log;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
public class MyHandler extends StreamHandler {
@Override
public void publish(LogRecord record) {
//add own logic to publish
super.publish(record);
}
@Override
public void flush() {
super.flush();
}
@Override
public void close() throws SecurityException {
super.close();
}
}
Java 로깅 포매터
포매터는 로그 메시지를 서식화하는 데 사용됩니다. Java 로깅 API에는 두 가지 유형의 포매터가 있습니다.
- SimpleFormatter: 이 포매터는 기본 정보를 포함한 텍스트 메시지를 생성합니다. ConsoleHandler는 로그 메시지를 콘솔에 출력하기 위해 이 포매터 클래스를 사용합니다.
- XMLFormatter: 이 포매터는 로그를 위한 XML 메시지를 생성합니다. FileHandler는 기본 포매터로 XMLFormatter를 사용합니다.
우리는 java.util.logging.Formatter
클래스를 확장하여 자체 사용자 정의 Formatter 클래스를 만들고 핸들러 중 하나에 첨부할 수 있습니다. 다음은 간단한 사용자 정의 포매터 클래스의 예입니다.
package com.journaldev.log;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;
public class MyFormatter extends Formatter {
@Override
public String format(LogRecord record) {
return record.getThreadID()+"::"+record.getSourceClassName()+"::"
+record.getSourceMethodName()+"::"
+new Date(record.getMillis())+"::"
+record.getMessage()+"\n";
}
}
자바에서의 Logger – 자바 로그 관리자
java.util.logging.LogManager
는 로깅 구성을 읽고 로거 인스턴스를 생성하고 유지하는 클래스입니다. 이 클래스를 사용하여 우리만의 응용 프로그램 구성을 설정할 수 있습니다.
LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
다음은 Java Logging API 구성 파일의 예입니다. 구성을 지정하지 않으면 JRE 홈 lib/logging.properties
파일에서 읽습니다. mylogging.properties
handlers= java.util.logging.ConsoleHandler
.level= FINE
# 기본 파일 출력은 사용자 홈 디렉토리에 있습니다.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
# 콘솔에 인쇄되는 메시지를 INFO 및 그 이상으로 제한합니다.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
com.journaldev.files = SEVERE
다음은 Java에서 Logger를 사용하는 간단한 프로그램의 예입니다.
package com.journaldev.log;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class LoggingExample {
static Logger logger = Logger.getLogger(LoggingExample.class.getName());
public static void main(String[] args) {
try {
LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
} catch (SecurityException | IOException e1) {
e1.printStackTrace();
}
logger.setLevel(Level.FINE);
logger.addHandler(new ConsoleHandler());
// 사용자 정의 핸들러 추가
logger.addHandler(new MyHandler());
try {
// 최대 크기와 로그 파일 제한 수를 가진 FileHandler 파일 이름
Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
fileHandler.setFormatter(new MyFormatter());
// FileHandler에 대한 사용자 정의 필터 설정
fileHandler.setFilter(new MyFilter());
logger.addHandler(fileHandler);
for(int i=0; i<1000; i++){
// 로깅 메시지
logger.log(Level.INFO, "Msg"+i);
}
logger.log(Level.CONFIG, "Config data");
} catch (SecurityException | IOException e) {
e.printStackTrace();
}
}
}
위의 java logger 예제 프로그램을 실행하면 CONFIG 로그가 파일에 인쇄되지 않음을 알 수 있습니다. 이는 MyFilter 클래스 때문입니다.
package com.journaldev.log;
import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;
public class MyFilter implements Filter {
@Override
public boolean isLoggable(LogRecord log) {
// 파일에 CONFIG 로그를 기록하지 않습니다.
if(log.getLevel() == Level.CONFIG) return false;
return true;
}
}
또한 출력 형식은 MyFormatter 클래스에서 정의한 것과 같습니다.
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980
FileHandler에 자체 Formatter 클래스를 추가하지 않으면 로그 메시지가 다음과 같이 인쇄됩니다.
<record>
<date>2012-12-14T17:03:13</date>
<millis>1355533393319</millis>
<sequence>996</sequence>
<logger>com.journaldev.log.LoggingExample</logger>
<level>INFO</level>
<class>com.journaldev.log.LoggingExample</class>
<method>main</method>
<thread>1</thread>
<message>Msg996</message>
</record>
콘솔 로그 메시지는 다음 형식입니다:
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
아래 이미지는 최종 Java Logger 예제 프로젝트를 보여줍니다. 이것이 Java에서의 Logger 및 Java Logger 예제에 대한 전부입니다. 프로젝트를 아래 링크에서 다운로드할 수 있습니다.
참조: Java 로깅 API
Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example