slf4j
들어가기.
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를 저장하고 스레드가 소멸될 때 이 아이디도 소멸이 된다.
- 각 메서드에서 이 값을 불러서 로그 출력시 함께 출력해 각 요청의 로그를 분류