1. Spring logging
예전의 Spring 은 JCL (Jakarta Commons Logging) 을 사용하여 로깅을 구현하였다. JCL 은 인터페이스 형태로 되어 있는데, 이를 구현한 구현체를 사용하여 여러 로깅 구현체로 교체하면서 사용할 수 있다.
JCL 의 구현체는 Configuration 을 통해서 설정할 수 있는데, JCL 이 구현체를 선택하는 시점은 컴파일 시점이 아닌 런타임 시점이다. 그렇기 때문에 JCL 은 클래스 로더에 의존적인 방식으로 로깅 구현체를 찾게된다.
JCL 은 클래스 로더를 통해 컴파일 시점에 로깅 구현체를 찾는 방식에서 가비지 컬렉션이 제대로 작동하지 않는 문제가 발생한다. 이러한 문제를 해결하기 위해 클래스 로더 대신에 컴파일 시점에 구현체를 선택하는 방식으로 변경되는데, 이때 도입되는 것이 Slf4j 이다.
Slf4j 는 Bridging, API, Binding 모듈을 제공하여 컴파일 시점에 로깅 구현체를 결정한다. 스프링부트 에서는 Logback 이 기본 구현체로 선택되어 있다.
2. Slf4j
Slf4j 는 Simple Logging Facade For Java 의 약자이다.
자체적인 로깅 프레임워크, 라이브러리가 아니고 JCL 과 같은 logger 추상체로써 다른 로깅 프레임워크가 접근할 수 있도록 해주는 추상화 계층이다. 실제 로깅 프레임워크 구현체인 log4j 나 logback 의 인터페이스 역할을 한다. 그렇기 때문에 Slf4j 를 이용하면 코드를 일정하게 유지하면서 구현체의 전환을 통해 다른 로깅 프레임워크로의 전환을 쉽게 할 수 있다.
3. log4j
log4j 는 가장 오래된 로깅 프레임워크로써 Apache 의 java 기반 로깅 프레임워크이다. 콘솔 및 파일 출력의 형태로 로깅을 수행한다.
log4j.properties, log4j.xml 와 같은 설정 파일을 통해서 로깅 환경 설정을 구성할 수 있으며, 2015년 을 마지막으로 개발이 중단되었다.
- log4j 의 구성
Logger | 출력할 메세지를 Appender 에게 전달한다. |
Appender | 전달된 로그를 어디에 출력할 것인지 결정한다. (Console, File, JDBC 등) |
Layout | 로그의 출력 형식을 결정한다. |
- log4j 로그 레벨
FATAL > ERROR > WARN > INFO > DEBUG > TRACE
4. logback
logback 은 log4j 이후에 출시된 로깅 프레임워크로 가장 널리 사용되고 있는 프레임워크 중 하나이다. sl4fj 의 구현체로써 Springboot 환경에서 spring-boot-starter-web 를 사용하는 경우 spring-boot-starter-logging 의 logback 이 해당 라이브러리에 포함되어 있어서 추가적인 dependency 를 설정해 줄 필요없다.
log4j 에 비해 향상된 필터링 정책 및 기능과 로그 레벨 변경 등에 대해 서버 재시작 없는 자동 리로딩 등을 지원해준다.
일반적으로 logback 의 설정은 logback.xml 파일로 하는데, Springboot 에서는 logback-spring.xml 파일을 통해서 로그 관련 설정을 수행한다. logback-spring.xml 파일은 resources 디렉토리 아래에 위치한다.
5. log4j2
log4j2 는 가장 최신에 나온 로깅 프레임워크로 log4j 의 다음 버전이다. logback 처럼 필터링 기능과 자동 리로딩을 지원한다.
logback 과 가장 큰 차이는 multi thread 환경에서 비동기 로거의 경우 다른 로깅 프레임워크보다 처리량이 훨씬 많고 대기 시간이 짧다는 것이다. 또한, Java 8 부터 도입된 람다식을 지원하고 lazy evaluation 을 지원한다.
log4j2.xml 파일을 통해서 로그 환경을 설정한다.
[Reference]
- https://www.sangkon.com/hands-on-springboot-logging/
- https://minkwon4.tistory.com/161
'Tech > Spring | SpringBoot' 카테고리의 다른 글
[Spring] Database 연동 - 4 (JPA) (0) | 2022.10.22 |
---|---|
[SpringBoot] Logging - 2 (Logback) (0) | 2022.10.05 |
[SpringBoot] Database 연동 - 3 (JdbcTemplate) (1) | 2022.09.21 |
[SpringBoot] Database 연동 - 2 (JDBC) (0) | 2022.09.17 |
[SpringBoot] Database 연동 - 1 (DataSource, h2 database) (0) | 2022.09.13 |