헤르메스 LIFE

[Spring Boot] SLF4J를 이용한 Log 설정 시 주의점 본문

Spring Framework

[Spring Boot] SLF4J를 이용한 Log 설정 시 주의점

헤르메스의날개 2021. 1. 9. 13:49
728x90

출처 : 백기선님의 강의 www.youtube.com/watch?v=o2-JaRD9qQE&t=907s&ab_channel=springcamp.io

1. 중요 !!!

- SLF4J ( Simple Logging Facade for Java )  는 Interface 입니다.

- Spring Boot 은 기본적으로 JCL ( Jakarta Common Logging ) 을 이용해서 Logging 코드를 생성할 수 있습니다.

- Spring Boot Application은 Logback을 이용한 SLF4J를 사용합니다.

- 다른 Logging 라이브러리를 사용할 수 있습니다. ( 각 Log API 라이브러리와의 의존성을 끊어줘야 합니다. )

 

2. SLF4J 구현체

slf4j-log4j12-{version}.jar : Log4j 1.x 를 이용해 Logging 하기위한 라이브러리

slf4j-jdk14-{version}.jar : JDK1.4 ( java.util.logging 또는 JUL )를 이용해 Logging 하기위한 라이브러리

slf4j-nop-{version}.jar : nop 를 이용해 Logging 하기위한 라이브러리

slf4j-jcl-{version}.jar : JCL ( Jakarta Common Logging ) 을 이용해 Logging 하기위한 라이브러리

logback-classic-{logback-version}.jar : Logback을 이용해 Logging 하기위한 라이브러리

※ 여기 구현체들을 라이브러리 Path에 전부 넣어두면 설정에 맞게, 구현체를 찾아서 아무거나 실행된다. 예를 들어 log4j 설정도 있고, logback 설정도 존재하고 한다면 둘 중 하나가 무작위로 수행 될 수 있기때문에 주의 해야 합니다.

- 사실 이 구문이 가장 중요한것 같습니다. 프로젝트 설정 시 복붙하다보면 있는데로 붙여넣게 되는데.. 필요없는 라이브러리가 포함되고, 또 그게 어떤 동작을 하는지도 잘몰라서 그냥 놔둬야 했는데, 로그는 이제 그 사용을 이해할 수 있었습니다.

 

3. SLF4J 를 사용할 수 있도록 Bridge 해주는 라이브러리

jcl-over-slf4j.jar
- JCL 호출을 SLF4J 로 연결하는 라이브러리
- 설정 시 common-logging.jar 제거
- slf4j-jcl.jar 와 같이 사용하면 안됨. ( 무한루프 )

log4j-over-slf4j.jar
-Log4j 호출을 SLF4J 로 연결하는 라이브러리
- 설정 시 log4j.jar 제거
- slf4j-log4j12.jar 와 같이 사용하면 안됨. ( 무한루프 )

jul-to-slf4j.jar
- java.util.logging 은 교체 불가능
- LogRecord 객체를 사용해서 위임
- slf4j-log4j12.jar 와 같이 사용하면 안됨. ( 무한루프 )

 

4. 무한루프의 원리

1. log4j API 를 호출하면 -> 2. 모든 logging은 가짜 Log4j 인 Bridge를 호출하고 -> 3. Bridge 는 SLF4J API 를 호출하고 -> 4. SLF4J 는 Binding 을 통해서 Log4j 를 호출한다. 

결국, Log4j는 모든 logging을 호출하는 Bridge 를 호출하기 때문에 문한루프가 발생된다.

 

5. logback 만을 호출하도록 하는 방법 ( 2015년 동영상이라.. ㅡㅡㅋ )

1. logbak 을 제외한 모든 Bridge 라이브러리를 넣어준다.
2. 모든 Log api 호출은 SLF4J 를 호출하고
3. SLF4J 는 Logback 만을 호출한다.

 

SLF4J 는 Interface 이기때문에 구현체를 이용해서 Logging 하게 됩니다. 이때 SLF4J Binding를 이용합니다.

6. Spring Boot 에서 구현체를 찾는 순서

1. 설정파일찾기
2. Application Classpath에서 Log4j 구현체 찾기
3. Application이 JDK 1.4 에서 구동중인지 확인
4. 아무것도 찾지 못하면 JCL ( Jakarta Common Logging ) 사용

 

※ 참고

예전 JCL 은 debug 모드일 경우만 사용할 수 있도록 if 문으로 감쌌었습니다.

if ( logger.isDebugEnabled()) {
    logger.debug("..................");
 }

Log4j를 사용하면서 if 를 제거 해도 성능 상 문제되지 않습니다.

logger.debug("{}", "................");

 

728x90