728x90
Summary
비동기식 로깅에 대해 알아봅시다.
spring boot에서 logback을 이용하여 비동기식 로깅하는 방법에 대해 알아봅시다.
What is asynchronous logging
- synchronously file write 하면 file writing에 대한 딜레이가 발생하게 된다.
- file i/o는 인메모리 작업이 아니기 때문에 딜레이가 커진다.
- 비동기식 로깅은 '로그 발생'과 '로그 쓰기'를 분리시킨다.
- thread A는 로그가 발생하면 인메모리 큐에 집어넣기만 한다.
- thread B는 큐에서 데이터를 꺼내서 file write만 수행한다.
- logback에서 비동기식 로깅을 위한 방법을 지원해준다.
What is logback
- looging의 기능을 제공하는 프로젝트
- log4j에서 떨어져 나온 프로젝트라서 log4j와 유사하지만 기능/성능이 더 좋다.
- slf4j를 지원하기 때문에 사용자는 쉽게 log4j를 logback으로 변경할 수 있다.
- spring boot에선 spring-boot-starter-logging을 추가하여 이용 가능하다. (spring-boot-starter-web에 포함되어있다)
Feature of logback AsyncAppender
- 비동기식으로 로그를 남긴다.
- AsyncAppender는 큐에 있는 쓰기 대기상태의 로그 메시지를 꺼내오는 event dispatcher 역할이라서 실제 로그를 남기는 건 appender를 참조시켜줘야 한다.
- AsyncAppeder가 생성한 worker thread가 큐에서 메시지 하나 꺼내서 AsyncAppender에 연결된 appender에 넘겨주면(dispatch) appender가 로그를 write 하는 작업을 알아서(비동기)로 처리한다.
- AsyncAppender는 발생한 로그를 BlockingQueue에 보관한다.
- 큐의 용량이 80%가 차면 TRACE, DEBUG, INFO 수준의 로그는 큐에서 제거한다.
- 서버가 멈추거나 재배포될 때는 maxFlushTime 만큼 큐에 남아있던 걸 처리하고 끝난다.
- maxFlushTime을 0으로 하면 queue를 모두 처리할 때까지 기다리게 된다.
- AsyscAppender의 속성 값은 아래와 같다
- queueSize : BlockingQueue 사이즈, default는 256이다.
- discardingThreshold : 큐 사이즈 몇 % 남았을 때 log들을 drop 시킬지 수치
- includeCallerData : 로그 호출한 곳에 대한 정보를 표시할지 여부
- maxFlushTime : 위에서 기술함
- neverBlock : 큐가 다 찼을 때, 메시지를 넣을지 말지 결정. true로 하면 메시지 넣는 것을 기다리지 않고 날려버리지만 속도는 빨라짐
Related files
logback-local.xml
application.properites
Pros and Cons of asynchronous logging
- 장점
- application 입장에서는 로그 발생 시 file i/o 작업이 사라지므로 빨라진다
- 단점
- 비동기식이라 서비스의 성공!= 로그기록 성공이다. 서비스가 성공했지만 다양한 이유(큐 메모리 초과, 시스템 종교 등)때문에 로그의 손실이 발생할 수 있다.
- 이에 따라 큐 메모리 관리 등 관리대상이 늘어나게 된다.
결론
비동기식 로깅은 데이터의 로깅이 많이 필요하고, 속도가 더 중요하다면 좋은 선택지라고 생각된다. 클래스마다 로깅 방법을 지정할 수 있기 떄문에 부분적으로 적용해보는 것도 좋은 방법일 것 같다.
reference Link
'Backend > spring' 카테고리의 다른 글
[spring] offline 환경에서 gradle 빌드 환경 세팅 (0) | 2021.09.13 |
---|---|
[spring] spring boot에서 SQLite를 JPA로 사용하기 (0) | 2021.09.13 |
[spring] spring boot에서 actuator 사용하기 (0) | 2021.07.12 |
[JPA] N+1 문제와 그 해결법 (0) | 2021.07.10 |
[spring, logback] 비동기식 로깅 - AsyncAppender - 2 (0) | 2021.07.08 |