자바의 로깅 - Slf4j, Log4j, Logback, Log4j2

June Lee·2021년 9월 23일
0

Java

목록 보기
18/23

Slf4j : Simple Logging Facade For Java. Logger의 추상체로써, 다른 로깅 프레임워크의 인터페이스 역할. Slf4j를 사용하면 코드를 유지하면서 다른 구현체로 전환이 용이.

Logback : Slf4j의 구현체. spring-boot-starter-web 안에 기본적으로 포함되어있음. log4j에 비해서 향상된 필터링 정책, 로그 설정 변경 시 서버 재시작 없이 리로딩 등을 지원

Log4j/Log4j2 : Slf4j의 구현체. 콘솔, Json, 파일, JDBC 등의 형태로 로깅을 할 수 있게 도와주는 Appender가 있음. Layout을 통해 로그를 어떤 형식으로 출력할지 정할 수 있고, 이미 정해져있는 패턴들을 통해 손쉽게 여러 정보들을 로그로 찍을 수 있음.
log4j2의 경우에도 필터링 및 자동 리로딩 지원. logback과의 가장 큰 차이는 멀티 쓰레드 환경에서 비동기 로거를 지원하여 멀티 쓰레드 환경에서의 성능이 다른 로거들에 비해 월등히 좋다는 점. 또한 람다식 및 Lazy Evalution(불필요한 연산을 줄이기 위해 연산을 지연. 아마 오퍼레이터 여러 개가 이어져있을 때 가장 효율적인 방식으로 순서를 바꾸거나 생략하는 것 관련된 개념일듯. 나중에 좀 더 깊이 공부해보장**) 지원.

구성요소

  • Logger : message와 함께 call하는 것
  • Appender : Logger는 하나 이상의 어펜더를 가짐. 이 어펜더는 Log Event와 함께 call됨. 이 어펜더를 이용하면 여러 곳에 로그를 동시에 출력하는 것이 가능(ex. 파일, 콘솔..)
  • Layout(컨버터가 레이아웃을 정함): 로깅되는 메세지의 실제 포맷. 컨버터 여러개를 정의하면 이 컨버터가 레이아웃을 변경하여 실제로 메세지를 포맷팅하고 필요한 정보를 추가해줌. date, exception, message 등을 위한 컨버터가 존재하고, 커스텀 컨버터를 정의하는 것도 가능. 컨버터를 이용하면 로깅 중 민감 정보 마스킹 등 다양한 작업이 가능.

Log4j2 관련 참고 자료
https://www.baeldung.com/log4j2-plugins

커스텀 컨버터 관련 참고 자료
https://petrepopescu.tech/2021/03/how-to-make-a-custom-message-converter-for-log4j2/

레이아웃 및 패턴 관련 참고 문서
https://logging.apache.org/log4j/2.x/manual/layouts.html

위의 문서를 보면 다양한 변환 패턴이 있는데, Log4j2는 변환 패턴을 이해하고 포맷팅된 날짜 또는 타임스탬프로 대체하는 DatePatternConverter를 통해 이 %d 패턴을 변환함

현재 내 생각으로는, 위의 패턴에서 지원해주지 않지만 로깅에 필요한 컨텍스트들은 따로 일정한 시점에 MDC(Mapped Diagnostic Context)에 저장해두고 여기서 꺼내서 찍어주는 것 같음. 그런데 문제는, MDC가 스프링 MVC와 같은 request per thread 모델에서는 잘 동작하지만(MDC는 기본적으로 Thread Local을 만들어서 저장함(Thread Context). 즉 쓰레드 하나의 저장 공간에 컨텍스트를 저장한다는 의미), 스프링 웹플럭스는 요청 하나가 쓰레드 하나를 의미하지 않으므로 컨텍스트 격리에 신경써줘야하는 것 같음!

cf)
Tomcat, Netty 등 WAS는 쓰레드를 요청마다 무한히 만들어내는게 아니라 쓰레드 풀로 관리해서 쓰기 때문에 응답 후 Thread Local(+ 쓰레드 로컬 기반인 MDC도)을 초기화 하지 않을 경우 이전에 사용한 정보가 남아 있음 -> 따라서 반드시 초기화를 주기적으로 해줘야함.



< 멀티 쓰레드 환경에서의 로깅 프레임워크 간 성능 비교>

profile
📝 dev wiki

0개의 댓글