Logging 라이브러리 종류
Log4J
- 굉장히 오래된 로깅 라이브러리.
- 2015년 8월 5일 이후 지원이 종료되어 사용하지 않는다.
Logback
- Log4J 이후 출시된 보다 향상되고 가장 널리 사용되는 라이브러리.
- 필터링 기능과 자동 리로딩을 지원한다.
- SLF4J의 구현체로써 동작하며, 스프링 부트에서 기본으로 사용된다.
Log4J2
- 가장 최신에 나온 라이브러리이며, Apache Log4J의 다음 버전이다.
- 필터링 기능과 자동 리로딩을 지원한다.
- SLF4J의 구현체이다.
- 멀티 쓰레드 환경에서 비동기 로거( Async Logger )의 경우
다른 Logging 프레임워크보다 처리량이 많고, 대기시간이 짧다.
- Java Lambda를 지원한다.
SLF4J
- 로깅 통합 인터페이스
- 스프링 부트에서 로깅을 구현할 때 사용된다.
코드의 변경 없이 설정만 변경하는 것으로 다른 로깅 라이브러리로 변경할 수 있게 도와준다.
- 프로그래머는 SLF4J를 이용해 코드를 작성하고,
SLF4J는 컴파일 시점에 등록된 구현체 라이브러리( Logback )를 바인딩하여 동작한다.
Logging의 장점
- Thread 정보, Class 이름 같은 부가 정보를 함께 볼 수 있고, 출력 모양을 정할 수 있다.
- 로그 레벨에 따라 개발 서버에서는 모든 로그를 출력하고, 운영 서버에서는 출력하지 않는 등,
로그를 상황에 맞게 조절할 수 있다.
- 콘솔에만 출력하는 것이 아닌, 파일이나 네트워크 등 별도의 위치에 남길 수 있다.
- 비동기로 동작한다.
System.out.println()을 사용하지 않는 이유
로깅을 System.out.println() 로 하면 안되는 이유
- 프로그램과 독립적인 별개의 파일로 저장할 수 없다.
- 문제가 발생한 날짜, 시각, 문제의 수준, 발생한 위치 등 정보를 기록하기 어렵다.
- 로그 출력 레벨을 사용할 수 없다.
- 운영 서버에 올리기 전,
디버깅용도로 사용된 println
을 일일이 지워주거나 별도의 조건문을 통해 처리를 해주어야한다.
- 동기적으로 호출된다.
println
은 synchronized
키워드가 붙어있다. ( 동기화 )
- 톰캣은 멀티쓰레드로 동작하는데,
멀티쓰레드 환경에서 하나의 쓰레드가 호출하면 잠기게 된다.
사용법
로그 선언
private Logger log = LoggerFactory.getLogger(getClass());
private static final Logger log = LoggerFactory.getLogger(Xxx.class);
@Slf4j
( Lombok )
로그 호출
log.info("hello");
log.info("value = {}", value);
주의!
"value = " + value
는 사용하지 않는다.
info.debug
처럼 레벨에 따라 무시되는 함수에 사용할 경우, a + b 계산 로직이 실행되어 불필요한 계산이 발생한다.
로그 단계
trace
> debug
> info
> warn
> error
> fatal
- 설정된 로그 레벨에 따라 순위에 맞춰 출력되거나 무시된다.
- 예를 들어
info
level로 설정되어 있으면, trace
, debug
level은 무시된다.
Level | Color | 비고 |
---|
Fatal | RED | 심각한 문제 |
Error | RED | 사용자 요청을 처리하는 중 발생한 문제 |
Warn | YELLOW | 처리 가능한 문제지만, 향후 시스템 에러의 원인이 될 수 있는 문제 |
Info | GREEN | 로그인이나 상태 변경과 같은 정보성 메시지 |
Debug | GREEN | 개발시 디버깅 목적으로 출력하는 메시지 |
Trace | GREEN | Dubug보다 좀 더 상세한 메시지 |
로그 레벨 설정
application.properties
# 전체 로그 레벨 설정 ( 기본 info )
logging.level.root=info
# hello.springmvc 패키지와 그 하위 로그 레벨 설정
logging.level.hello.springmvc=trace
출저