spring

slf4j

Dexlee 2022. 6. 18. 14:55

들어가기.

slf4j 설명에 앞서 logging에 대해 정리하고 slf4j에 대해 설명하겠다.

 

1. log란?

api 호출 정보를 기록한 데이터

 

2. logging이란?

로그를 생성하는 과정

 

3. log level 순서

trace < debug < info < warn < error

1) error

  • api 호출 에러 발생 시 해당 에러에 대한 로그 표시

2) warn

  • 경고 메세지

3) info

  • api 호출 성공적인 경우 정보성 로그 표시

4) debug

  • info보다 더 상세한 정보로 디버깅하기 위한 정보 표시

5) trace

  • debug보다 더 상세한 정보

6) 동작 원리

  • 출력 레벨을 설정하면, 출력 레벨보다 더 상위 레벨의 로그까지 볼 수 있다.
  • ex) info로 설정하면 warn, error까지 볼 수 있다.

4. slf4j(simple logging facade for java)란?

로깅 프레임워크(logback 등)에 대한 logging 추상화 라이브러리

 

5. gradle 의존성 추가

spring-bbot-starter-data-jpa를 추가하면 spring-boot-starter-logging 의존성이 포함되어 있고 이 안에 slf4j와 logback 의존성이 포함되어 있다.

그래서 jpa를 사용하면 의존성을 따로 추가할 필요 없고, jpa를 사용하지 않는다면 starter-logging만 추가해주면 된다.

 

6. logging process

1) 개발환경

slf4j api를 사용하여 로깅 코드 작성

(1) 사용방법

일반적인 상황 : log.info()

예외적인 상황 : log.error()

[1] 자바

보통 lombok을 의존성 추가하고 사용하므로 @slf4j 를 붙이고 log 로 접근하면 된다.

 

[2] 코틀린

lombok을 사용 안 하므로 직접 logger를 만들어서 접근한다.

inline fun <reified T> logger(): Logger {
    return LoggerFactory.getLogger(T::class.java)
}
private val log = logger<LoggingFilter>()

2) 배포환경

바인딩된 logging framework가 실제 로깅 코드를 수행

즉, 애플리케이션 레이어에서 SLF4J 사용해서 Logging 코드를 작성하면 실제 로그를 출력하는 행위는 Logback 하게 된다.

 

7. MDC(Mapped Diagnostic Context)란?

  • 스레드 별로 로그 분류하기 위해 사용

1) MDC 사용 이유

  • 멀티  스레드 환경에서 각 스레드가 컨텍스트 스위칭을 하게 되는데 그 때 로그도 일관되게 남기지 않게 된다. 그래서 각 로그를 기록할 때 각 요청 마다 고유의 id를 부여해서 각 요청의 로그를 묶을 수 있다. 이 id를 correlation id 라고 부른다.

2) 동작 원리

  • 각 스레드가 전역 변수인 ThreadLocal에 correlation ID를 저장하고 스레드가 소멸될 때 이 아이디도 소멸이 된다.
  • 각 메서드에서 이 값을 불러서 로그 출력시 함께 출력해 각 요청의 로그를 분류