Java 로깅 기초와 모범 사례
Java 로깅 기초
이 튜토리얼에서는 예제와 함께 Java 로깅과 다양한 구성 요소를 학습합니다.
Java는 로깅 과정을 통해 로그 메시지와 파일을 생성하고 캡처할 수 있습니다.
Java에서 로깅에는 프레임워크와 API 필요. Java는 java.util.logging 패키지에 내장 로깅 프레임워크 보유.
Log4j, Logback 등 서드파티 프레임워크도 로깅 목적으로 사용 가능.
Java 로깅 구성 요소
아래 그림은 Java 로깅 API(java.util.logging) 핵심 구성 요소와 제어 흐름 나타냄.
1. Logger
Logger 클래스는 로깅용 메서드 제공. Logger 클래스 객체 인스턴스화해 메서드 호출로 로깅.
예제:
Logger logger = Logger.getLogger("newLoggerName");
Logger 클래스 getLogger() 메서드로 Logger 찾거나 새로 생성. 문자열 인수가 로거 이름 정의.
여기서 동일 이름 기존 Logger 반환 또는 새 Logger 객체 생성.
현재 클래스 후 class.getName()으로 Logger 정의 관례.
Logger logger = Logger.getLogger(MyClass.class.getName());
참고: 전달된 이름이 null이면 NullPointerException 발생.
각 Logger는 로그 메시지 중요도 결정하는 레벨 가짐. 7가지 기본 로그 레벨:
| 로그 레벨 (내림차순) | 용도 |
|---|
| SEVERE | 심각한 실패 |
| WARNING | 경고 메시지, 잠재적 문제 |
| INFO | 일반 런타임 정보 |
| CONFIG | 설정 정보 |
| FINE | 일반 개발자 정보(추적 메시지) |
| FINER | 상세 개발자 정보(추적 메시지) |
| FINEST | 매우 상세 개발자 정보(추적 메시지) |
| OFF | 모든 레벨 로깅 끄기(아무것도 캡처 안 함) |
| ALL | 모든 레벨 로깅 켜기(모든 것 캡처) |
각 로그 레벨은 심각도 결정하는 정수 값 가짐, OFF와 ALL 두 특수 레벨 제외.
메시지 로깅
기본적으로 상위 3개 로그 레벨 항상 로깅. 다른 레벨 설정하려면:
logger.setLevel(Level.LogLevel); // 예 logger.setLevel(Level.FINE);
이 예제에서 FINE 레벨과 그 위 레벨만 로깅 설정. 다른 모든 로그 메시지 드롭.
이제 메시지 로깅 위해 log() 메서드 사용.
logger.log(Level.LogLevel, "log message"); // 예 logger.log(Level.INFO, "This is INFO log level message");
원하는 레벨 로깅용 단축 메서드 존재.
logger.info("This is INFO log level message"); logger.warning("This is WARNING log level message");
설정 로그 레벨 통과한 모든 로그 요청은 LogRecord로 전달.
참고: 로거 레벨이 null로 설정되면 부모로부터 레벨 상속, 트리 위로 계속.
2. 필터 (Filters)
필터(존재 시) LogRecord 전달 여부 결정. 이름대로 특정 기준 따라 로그 메시지 필터링.
LogRecord는 지정된 기준 통과 시에만 로거에서 로그 핸들러로, 핸들러에서 외부 시스템으로 전달.
// 필터 설정 logger.setFilter(filter); // 필터 가져오기 Filter filter = logger.getFilter();
3. 핸들러 (Handlers/Appenders)
로그 핸들러 또는 어펜더가 LogRecord 받아 다양한 타깃으로 내보냄.
Java SE 제공 5가지 내장 핸들러:
| 핸들러 | 용도 |
|---|
StreamHandler | OutputStream에 쓰기 |
ConsoleHandler | 콘솔에 쓰기 |
FileHandler | 파일에 쓰기 |
SocketHandler | 원격 TCP 포트에 쓰기 |
MemoryHandler | 메모리에 쓰기 |
핸들러가 LogRecord를 필터에 전달해 외부 시스템 전달 여부 재결정 가능.
새 핸들러 추가:
logger.addHandler(handler); // 예 Handler handler = new ConsoleHandler(); logger.addHandler(handler);
핸들러 제거:
logger.removeHandler(handler); // 예 Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
로거 여러 핸들러 가질 수 있음. 모든 핸들러 얻기:
Handler[] handlers = logger.getHandlers();
핸들러가 Formatter 사용해 LogRecord 객체 문자열로 포맷 후 외부 시스템 내보내기.
Java SE 내장 Formatter 두 가지:
| 포매터 | 용도 |
|---|
SimpleFormatter | LogRecord 문자열 포맷 |
XMLFormatter | LogRecord XML 형태 포맷 |
핸들러 포맷용 코드:
// 문자열 형태 포맷 handler.setFormatter(new SimpleFormatter()); // XML 형태 포맷 handler.setFormatter(new XMLFormatter());
LogManager
LogManager 객체 전역 로깅 정보 추적. 로깅 설정과 로거 인스턴스 읽고 유지.
로그 매니저는 싱글톤, 즉 단일 인스턴스만 인스턴스화됨.
로그 매니저 인스턴스 얻기:
LogManager manager = LogManager.getLogManager();
로깅 장점
Java 로깅 장점:
- 프로그램 흐름 모니터링 도움
- 발생 가능한 에러 캡처 도움
- 문제 진단과 디버깅 지원