From 21fbb3a6c006f079ead08225004a5d77533afbdf Mon Sep 17 00:00:00 2001 From: Sumin Hwang <163857590+tnals0924@users.noreply.github.com> Date: Mon, 17 Aug 2026 21:16:02 +0900 Subject: [PATCH] =?UTF-8?q?chore:=20=EB=A1=9C=EA=B7=B8=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=EC=9D=84=20=EB=B9=84=EB=8F=99=EA=B8=B0=20appender=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20-=20#153?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Logback의 ConsoleAppender는 OutputStreamAppender를 상속하고 write가 동기화돼 있다. 톰캣 스레드 100개가 한 스트림에 쓰면 그 락에서 직렬화되고, 로그 한 줄의 비용이 그대로 응답시간에 실린다. #151에서 dev의 SQL 콘솔 출력을 끄자 납부자 목록 조회 p95가 452ms에서 240ms로 줄었다. 출력량을 줄여 절반을 회수했지만 구조는 그대로였다. LoggingFilter가 요청마다 남기는 한 줄이 여전히 같은 경로로 나간다. 출력을 더 줄이는 대신 요청 스레드에서 I/O를 떼어낸다. AsyncAppender 기본값 두 개는 의도와 맞지 않아 명시적으로 바꿨다. - discardingThreshold: 기본값 20은 큐가 80% 차면 INFO 이하를 조용히 버린다. LoggingFilter의 요청 로그가 INFO라 부하 상황에서 소리 없이 사라진다. 0으로 두어 레벨과 무관하게 큐에 자리가 있는 한 남긴다. - neverBlock: 기본값 false는 큐가 가득 차면 요청 스레드를 블로킹한다. 비동기로 만든 이유가 사라지므로 true로 둔다. 응답시간을 지키는 게 목적이라 로그 유실보다 블로킹을 더 나쁘게 봤다. 커스텀 설정 파일이 있으면 Spring Boot 기본 로깅 설정이 통째로 대체되므로, 로그 포맷과 CONSOLE appender 정의는 defaults.xml과 console-appender.xml을 include해 그대로 쓴다. 목적지는 콘솔 그대로 두었다. CapRover가 stdout을 수집하는 구조라 파일 appender는 필요하지 않다. Co-Authored-By: Claude Opus 5 --- src/main/resources/logback-spring.xml | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/main/resources/logback-spring.xml diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..284ec42 --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + true + + + 0 + + + 4096 + + + false + + + + + +