자바로 개발하다보면 log4j를 사용해 개발하는 경우가 대부분이었는데, 스프링 부트를 접하면서 slf4j로 갈아타는 추세인 것 같다.
Simple Logging Facade for Java (SLF4J)
를 줄여서 SLF4J 라고 부르는데, facade 패턴의 로깅방식을 지원하는 방법이라고 보면 된다.
facade 패턴은
소프트웨어 공학 디자인 패턴 중 하나이며, client 는 facade(퍼사드, 정면) 만 바라보고 원하는 기능을 요청하면 그 뒤의 다양한 경로들의 접근은 신경쓰지 않아도 되는 방식이다.
slf4j를 보면 logback, log4j, log4j2를 사용하는데 있어 slf4j만 호출해서 명령하면 logback이던 log4j이던 동작시킬 수 있다.
별도의 logback, log4j, log4j2 를 통합해서 인터페이스로 사용해야하는데, 이를 slf4j라는 추상체를 이용해 통합해 사용하는 것이다.
slf4j 사이트 참조
일반적으로 sfl4j를 사용하는 이유는 logback을 사용하기 위함인데,
logback은 slf4j의 구현체로써 선언해 사용하는 경우가 대부분이며, log4j를 사용하는 방법과 크게 다르진 않다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
log4j
private static Logger logger = LogManager.getLogger(MyApplication.class);
logger.info("new transaction has been created");
logger.debug("processing {0} entries in loop", list.size());
--------------------------------------------------------------------------
slf4j
private static final Logger logger = LoggerFactory.getLogger(MyApplication.class);
logger.debug("test slf4j");
logger.info("new data {} has been created", list.size());
|
cs |
위 소스를 보면 다른점을 크게 느낄 수 없을 것이다.
logback이 애초에 log4j에서 파생되어 개선된 버전이라 그런걸 수도 있어 그렇게 생각되나,
log4j, log4j2, logback은 설정방법이 다르다.
그럼에도 불구하고 slf4j를 이용한다면 slf4j를 이용해서 로깅을 이용하는 것 처럼 사용할 수 있는 관리의 편리성이 생긴다.
그렇다면 slf4j를 사용하고 싶다면 어떻게해야할까?
방법은 여러가지다.
1. 라이브러리 추가(수동으로 추가)
- 스프링 부트 로깅라이브러리 ( slf4j, logback 제공 https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-logging)
(slf4j는 독립적으로 사용할 수 없는 추상체이기도하고, 주로 logback과 연계해 많이 사용함.)
dependency 에 대해 간단히 설명하자면
logback-classic 라이브러리는 slf4j-api 1.7.25에 의존성을 가지고 있기 때문에,
logback-classic 라이브러리를 추가했다면 slf4j 라이브러리를 추가하지 않아도 자동으로 설치가 된다.
Spring은 기본적으로 아파치 재단의 commons-logging을 이용해 로그를 남긴다.
Logback 라이브러리로 로그를 남기려면 commons-logging이 사용되지 않도록 설정을 해야 한다.
그런데 Spring은 내부적으로 commons-logging을 찾아 로깅을 하려고 해서, commons-logging을 사용하지 못하도록 설정하면 ClassNotFoundException이 발생한다.
이 문제를 해결하기 위해, SLF4J에서 제공하는 jcl-over-slf4j 라이브러리를 추가한 것이다.
jcl-over-slf4j는 commons-logging과 동일한 구조를 가진 라이브러리이며, 내부적으로 SLF4J를 사용하여 로그를 남긴다.
이런 식으로 Spring은 commons-logging 대신에 jcl-over-slf4j를 이용하여 로그를 남기게 된다.
https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j
2. spring 내장된 slf4j를 이용
spring에 내장된 slf4j를 이용할 수 있다.
spring boot로 프로젝트를 한다면 여기에 slf4j와 logback이 내장되어 있다보니,
별도 dependency를 추가할 필요 없이 사용할 수 있다.
3. lombok 추가 (lombok의 slf4j, logback 사용 https://mvnrepository.com/artifact/org.projectlombok/lombok)
lombok을 추가하여 lombok에 들어있는 slf4j를 사용한다.
어노테이션으로 선언해서 바로 로그를 찍어낼 수 있다.
gradle기반 dependency 추가
1
2
3
4
5
6
|
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
|
cs |
-----------------------------------------
이처럼 slf4j는 선언하여 사용하는게 목적이다.
실제로 logging 수행은 logback이나 log4j, log4j2 가 수행하는 것이다.(이게 중요개념)
이제 slf4j와 연계하여 logback을 사용하는 방법을 알아야 확실히 logging을 다룰 수 있을것이다.
이는 다음 포스팅에 정리해두겠다.
'IT기술 > spring' 카테고리의 다른 글
[spring] 예외처리 @ControllerAdvice, @ExceptionHandler를 이용한 예외처리 분리, 통합하기(Spring에서 예외 관리하는 방법, 실무에서 활용하는 방법) (0) | 2023.06.08 |
---|---|
[spring] logback 사용하기(slf4j 선언) (0) | 2023.06.01 |
[Rest] Swagger 란 Rest API 도구 (0) | 2023.04.03 |
Intellij Community 버전으로 spring 개발하기 (0) | 2023.03.24 |
apache Camel 정리 (1) | 2022.12.16 |