Java에서 기본으로 제공하는 Logging API를 소개합니다.
Log 출력
다음과 같이 Logger 객체를 생성하여 Log를 출력할 수 있습니다. Logger#log(level, message)
처럼 인자를 전달합니다.
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggingExample1 {
private static Logger logger = Logger.getLogger(LoggingExample1.class.getName());
public static void main(String[] args) {
logger.log(Level.WARNING, "Warning logging");
logger.log(Level.INFO, "Info logging");
logger.log(Level.SEVERE, "Severe logging");
}
}
Output:
Jun 12, 2021 3:04:45 PM LoggingExample1 main
WARNING: Warning logging
Jun 12, 2021 3:04:46 PM LoggingExample1 main
INFO: Info logging
Jun 12, 2021 3:04:46 PM LoggingExample1 main
SEVERE: Severe logging
Level 인자 없이 Log 출력
Level 인자 없이 warning()
, info()
등의 메소드를 이용하여 로그를 출력할 수 있습니다. 결과는 위와 동일합니다.
import java.util.logging.Logger;
public class LoggingExample2 {
private static Logger logger = Logger.getLogger(LoggingExample2.class.getName());
public static void main(String[] args) {
logger.warning("Warning logging");
logger.info("Info logging");
logger.severe("Severe logging");
}
}
Output:
Jun 12, 2021 3:06:19 PM LoggingExample2 main
WARNING: Warning logging
Jun 12, 2021 3:06:19 PM LoggingExample2 main
INFO: Info logging
Jun 12, 2021 3:06:19 PM LoggingExample2 main
SEVERE: Severe logging
Logger#setLevel()
setLevel(Level)
으로 특정 Level 이상의 로그들만 출력하도록 만들 수 있습니다.
다음과 같은 로그 레벨들이 있습니다. Severe가 가장 높고, Finest가 가장 낮은 로그 레벨입니다.
- SEVERE (highest value)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST (lowest value)
Log Level에 대한 자세한 내용은 Oracle - Logger Level를 참고해주세요.
예를 들어, 아래 코드처럼 setLevel(Level.WARNING)
으로 레벨을 설정하면, WARNING 이상의 로그만 출력이 됩니다.
즉, WARNING, SEVERE 레벨의 로그는 출력되고, INFO 로그는 출력되지 않습니다.
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggingExample5 {
private static Logger logger = Logger.getLogger(LoggingExample5.class.getName());
public static void main(String[] args) {
logger.setLevel(Level.WARNING);
logger.warning("Warning logging");
logger.info("Info logging");
logger.severe("Severe logging");
}
}
Output:
Jun 12, 2021 3:08:33 PM LoggingExample5 main
WARNING: Warning logging
Jun 12, 2021 3:08:33 PM LoggingExample5 main
SEVERE: Severe logging
Log Format 변경
기본적으로 출력되는 로그 형식이 마음에 들지 않는다면, Format을 변경할 수 있습니다.
로그 형식의 로그를 출력하려면 Handler를 등록해야 합니다. 기본으로 등록된 Handler를 삭제하지 않으면 두가지 형식의 로그가 모두 출력되기 때문에, 먼저 기본 Handler를 삭제하고 새로운 Handler를 등록해야 합니다.
아래와 같이 Fommater를 구현하여 Handler를 등록할 수 있습니다.
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.*;
public class LoggingExample3 {
private static Logger logger = Logger.getLogger(LoggingExample3.class.getName());
public static void main(String[] args) {
// remove default log handler
logger.setUseParentHandlers(false);
// add new log handler
Handler handler = new ConsoleHandler();
handler.setFormatter(new MyLogFormatter());
logger.addHandler(handler);
// logging
logger.warning("Warning logging");
logger.info("Info logging");
}
public static class MyLogFormatter extends Formatter {
@Override
public String format(LogRecord record) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date date = new Date(record.getMillis());
StringBuffer sb = new StringBuffer(1000);
sb.append(dateFormat.format(date));
sb.append(" [");
sb.append(record.getLevel());
sb.append("] ");
sb.append(record.getMessage());
sb.append("\n");
return sb.toString();
}
}
}
Output:
2021-06-12 15:12 [WARNING] Warning logging
2021-06-12 15:12 [INFO] Info logging
Log Format 변경 (2)
익명 객체와 String#format()
을 이용하여 구현한 예제입니다.
import java.util.Date;
import java.util.logging.*;
public class LoggingExample4 {
private static Logger logger = Logger.getLogger(LoggingExample4.class.getName());
public static void main(String[] args) {
// remove default log handler
logger.setUseParentHandlers(false);
// add new log handler
Handler handler = new ConsoleHandler();
handler.setFormatter(new SimpleFormatter() {
private static final String format = "[%1$tF %1$tT] [%2$-7s] %3$s %n";
@Override
public synchronized String format(LogRecord lr) {
return String.format(format,
new Date(lr.getMillis()),
lr.getLevel().getLocalizedName(),
lr.getMessage()
);
}
});
logger.addHandler(handler);
// logging
logger.warning("Warning logging");
logger.info("Info logging");
}
}
Output:
[2021-06-12 15:14:31] [WARNING] Warning logging
[2021-06-12 15:14:31] [INFO ] Info logging
References
Related Posts
- Java - hashCode(), 사용하는 이유? 구현 방법?
- Java8의 Stream reduce() 사용 방법 및 예제
- Java - filter, map, flatMap 사용 방법 및 예제
- Java - 2개의 Map 합치기 (merge, putAll)
- Java - ConcurrentModificationException 원인 및 해결 방법
- JUnit - @After와 @AfterClass의 차이점
- JUnit - @Before와 @BeforeClass의 차이점
- java와 javac의 차이점
- Java - 자바(JDK) 버전 확인 방법 (터미널, cmd 명령어)
- Java - java.util.Date를 java.sql.Date로 변환
- Java - 시스템 운영체제(OS) 정보 확인
- Java - 코드 실행 시간 측정
- Java - HashSet.retainAll() 사용 방법 및 예제
- Java - ArrayList.retainAll() 사용 방법 및 예제
- Java - ArrayList를 String으로 변환
- Java - float을 int로 변환
- Java - float을 String으로 변환
- Java - String을 boolean으로 변환
- Java - XML을 JSON으로 변환
- Java - ClassNotFoundException 발생 원인 및 해결 방법
- Java - private 생성자를 사용하는 이유
- Java - non-static method cannot be referenced from a static context
- Java - NoSuchMethodError 원인 및 해결 방법
- Java - Object를 byte[]로 변환
- Java - AbstractMethodError 원인 및 해결
- NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 에러
- Java - HttpClient에 Timeout 적용
- IntelliJ에서 Java 실행 파일 배포 (Export Runnable JAR)
- Java - JAR 디컴파일 방법 (JD-GUI, JD-CLI)
- Java - 키보드, 마우스 이벤트 받기 (이벤트 후킹)
- Java에서 윈도우 cmd 명령어 실행 및 결과 출력
- Java - Selenium 드라이버 자동 설치 방법
- Java - JSON 라이브러리 사용 방법 (JSONObject, JSONArray)
- Java - ZIP 압축, 압축 해제 (zip, unzip)
- Java - byte[] 배열을 File에 저장