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 - Unsupported class file major version 61 에러
- Java - String.matches()로 문자열 패턴 확인 및 다양한 예제 소개
- Java - 문자열 공백제거 (trim, replace)
- Java - replace()와 replaceAll()의 차이점
- Java - ArrayList 초기화, 4가지 방법
- Java - 배열 정렬(Sorting) (오름차순, 내림차순)
- Java - 문자열(String)을 비교하는 방법 (==, equals, compare)
- Java - StringBuilder 사용 방법, 예제
- Java - 로그 출력, 파일 저장 방법 (Logger 라이브러리)
- Java IllegalArgumentException 의미, 발생 이유
- Java - NullPointerException 원인, 해결 방법
- Seleninum의 ConnectionFailedException: Unable to establish websocket connection 해결
- Java - compareTo(), 객체 크기 비교
- Java - BufferedWriter로 파일 쓰기
- Java - BufferedReader로 파일 읽기
- Java charAt() 함수 알아보기
- Java - BigInteger 범위, 비교, 연산, 형변환
- Java contains()로 문자(대소문자 X) 포함 확인
- Java - Set(HashSet)를 배열로 변환
- Java - 문자열 첫번째 문자, 마지막 문자 확인
- Java - 문자열 한글자씩 자르기
- Java - 문자열 단어 개수 가져오기
- Java - 1초마다 반복 실행
- Java - 배열을 Set(HashSet)로 변환
- Java - 여러 Set(HashSet) 합치기
- Java - 명령행 인자 입력 받기
- Java - 리스트 역순으로 순회, 3가지 방법
- Java - 특정 조건으로 리스트 필터링, 3가지 방법
- Java - HashMap 모든 요소들의 합계, 평균 계산
- Java - 특정 조건으로 HashMap 필터링
- Java - 싱글톤(Singleton) 패턴 구현
- Java - 숫자 왼쪽에 0으로 채우기
- Java - String 배열 초기화 방법
- Java - 정렬된 순서로 Map(HashMap) 순회
- Java - HashMap에서 key, value 가져오기