728x90
프로젝트 진행 과정에서 API 에러 발생 시 로그를 통해 원인 분석을 하기 위해 Loki를 사용하였고, 이를 Grafana와 함께 활용하여 모니터링을 수행했습니다.
logback이란❓
Logback은 자바 기반 애플리케이션에서 로그를 기록하고 관리하기 위한 인기 있는 로깅 프레임워크입니다.
SLF4J(Simple Logging Facade for Java)와 호환되어 있어, SLF4J를 통해 로그 메시지를 작성하고 Logback을 통해 실제 로깅을 수행할 수 있습니다.
빠른 성능
- Logback은 높은 성능을 제공하도록 최적화되어 있어, 많은 양의 로그를 빠르게 기록할 수 있습니다.
유연한 구성
- XML 또는 Groovy 형식의 설정 파일을 사용하여 다양한 로깅 구성을 지원합니다.
- 이를 통해 로그 출력 형식, 로그 레벨, 로거의 동작 등을 세밀하게 조정할 수 있습니다.
다양한 로그 출력 방법
- 콘솔, 파일, 원격 서버 등 다양한 출력 대상을 지원합니다.
- 특히, 파일 롤링 기능을 통해 로그 파일의 크기나 날짜에 따라 자동으로 파일을 분리할 수 있습니다.
SLF4J 지원
- SLF4J와의 호환성을 통해 다양한 로깅 프레임워크와의 통합이 용이합니다.
- 이는 다른 로깅 프레임워크에서 Logback으로 쉽게 전환할 수 있게 합니다.
비동기 로깅
- Logback은 비동기 로깅 기능을 제공하여, 로깅 작업이 애플리케이션 성능에 미치는 영향을 최소화합니다.
- 이를 통해 로그를 비동기적으로 기록할 수 있어 성능 향상에 기여합니다.
MDC (Mapped Diagnostic Context)
- ThreadLocal 변수를 사용하여 로그 메시지에 추가 정보를 포함할 수 있어, 보다 상세한 로그 분석이 가능합니다.
기존 logback.xml
<configuration>
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http>
<url>http://13.124.27.13:3100/loki/api/v1/push</url>
</http>
<format>
<label>
<pattern>app=glowgrow,service=payment-service,level=%level</pattern>
</label>
<message>
<pattern>t=%d{yyyy-MM-dd HH:mm:ss.SSS} l=%level c=%logger{20} t=%thread | %msg %ex</pattern>
</message>
</format>
</appender>
<root level="DEBUG">
<appender-ref ref="LOKI" />
</root>
</configuration>
위의 설정에서, 로그는 3100 포트(모니터링 서버)로 전송되고 있습니다. 이로 인해 로컬 개발 환경에서 발생하는 로그를 로컬 콘솔에서 확인할 수 없고, Grafana에 직접 가서 로그를 확인해야 하는 상황입니다.
그러나 개발 환경에서 발생한 에러나 정보를 Loki를 통해 Grafana로 전송하는 것은 리소스 측면에서 비효율적이며, 불필요한 로그가 모니터링 서버에 남아 있는 것도 적합하지 않다고 판단되었습니다.
변경된 logback.xml
변경된 logback.xml 설정은 다음과 같습니다.
<configuration>
<!-- 프로필이 prod일 때 로키로 로그 전송 -->
<springProfile name="prod">
<appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
<http>
<url>http://13.124.27.13:3100/loki/api/v1/push</url>
</http>
<format>
<label>
<pattern>app=glowgrow,service=payment-service,level=%level</pattern>
</label>
<message>
<pattern>t=%d{yyyy-MM-dd HH:mm:ss.SSS} l=%level c=%logger{20} t=%thread | %msg %ex</pattern>
</message>
</format>
</appender>
<root level="DEBUG">
<appender-ref ref="LOKI" />
</root>
</springProfile>
<!-- 로컬 개발 환경에서 로그를 콘솔에 출력 -->
<springProfile name="local">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
</configuration>
위 설정은 springProfile을 사용하여 로컬 환경과 배포된 환경을 구분합니다.
로컬 환경에서는 local 프로필을 통해 IDE의 콘솔에 로그를 출력하도록 설정하고, 운영 환경에서는 prod 프로필을 사용하여 Grafana로 로그를 전송하도록 구성하였습니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.10.28 - 안전한 결제를 위한 보안 강화 방안 생각해보기 (0) | 2024.10.28 |
---|---|
[TIL, 일일 회고] 2024.10.27 - 고객과 디자이너의 매칭을 위한 게시글 정렬 시스템 개선 방안 고민해보기 (0) | 2024.10.27 |
[TIL, 일일 회고] 2024.10.25 - 코드 간결성과 불변성을 갖춘 Record 클래스 (0) | 2024.10.25 |
[TIL, 일일 회고] 2024.10.24 - DTO 설계에서 중첩 클래스 활용의 장단점 분석 (0) | 2024.10.24 |
[TIL, 일일 회고] 2024.10.23 - Spring boot Swagger 주요 어노테이션 (0) | 2024.10.23 |