본문 바로가기
Spring

Spring logging 동시성

by 권성호 2022. 4. 16.

사실이 아니라 공부한 내용과 생각을 정리한 글입니다. 언제든 가르침을 주신다면 감사하겠습니다.

 

모니터링을 위해 로깅은 필수적이다. 

spring에서는 @SLF4J를 사용하면 알아서 적절한 로그 구현체를 찾아준다.

회사에서 요구사항을 구현할 때에도 @SLF4J와 log.info(~~~)를 사용하여 로그를 남기고 장애 발생 시 모니터링 정보로 활용하고 있다.

 

습관적으로 로그를 남기다가 문득 아래와 같은 생각이 들었다.

  1. 로깅은 결국 File write(콘솔 출력이 아니라 별도의 파일에 남기는 것을 가정)
  2. 우리의 WAS 는 멀티스레드 환경
  3. 트래픽이 몰릴 때 로깅 코드에 동시에 수많은 스레드가 접근하여 로그를 찍을 것임
  4. 이때 로그 파일 순서 관련해서 동시성 문제가 발생할 법 함
  5. 근데 나는 로그 파일 보면서 로그 파일이 꼬인 것을 한 번도 본 적이 없음
  6. spring 이 사용하는 logging 모듈에서 이러한 동시성 문제를 알아서 해결해 주고 있는 것인가?

logging 모듈에서 멀티스레드 환경에서 마구잡이로 로그를 쓰려고 하는 상황에서 어떤 방식을 통해 안정적으로 로그를 남기는 걸까?

 

멀티 스레드가 비동기로 동시에 한 파일에 로그를 남기려 할 때 
[로그 string 을 만드는 놈] -> [Blocking queue] -> [로그 파일]
형태로 중간에 [Blocking queue]를 두고 producer & consumer 모델로 만든다

 

이렇게 하면 비즈니스 로직을 수행하는 스레드는 로그를 write 하는 작업을 logging 모듈에게 위임하고 본인은 핵심 비즈니스 로직 수행에 집중할 수 있다. 

로그를 write 하는 별도의 스레드는 Blocking queue에서 순차적으로 로그를 꺼내 write 하면 된다.

이렇게 하면 핵심 비즈니스 로직을 수행하는 것과 로그를 write 하는 것을 분리함과 동시에 로그를 write 할 때 발생할 수 있는 동시성 문제도 해결할 수 있다!

 

참고 링크

 

 

 

 

댓글