개요 목적
로깅이란 서비스의 동작 상태 확인이나, 장애 원인 파악을 위한 정보를 제공한다.
이번 시간에는 로깅 정보를 개발자가 커스텀 할 수 있도록 Logback 설정하는 법을 알아본다.
<이번 시간 구체적인 설정 목표>
- 콘솔을 내가 원하는 형식(패턴)으로 출력
- 파일에 WARN이상의 레벨만 저장할 수 있도록 설정
- 내가 직접 지정하지 않은 로거는 WARN레벨 이상만 출력 되도록 설정
Logback에 대해서 먼저 이해하기
Logback는 SpringBoot에서 가장 많이 사용하는 로깅 프레임 워크이다.
SLF4J의 구현체이고, Java에서 가장 많이 사용되었던, log4j 라이브러리의 후속 버전이다.
spring-boot-starter-web 안에 spring-boot-starter-logging에 구현체 라이브러리가 포함되어 있다.
로그 레벨
로깅에는 각 로그마다 레벨을 설정할 수 있다는 장점이 있다.
Logback 핵심 설정 요소(appender, logger, encorder)
appender
어펜더는 로그 메세지가 출력될 대상을 결정한다.(콘솔에 출력할지, 파일로 출력 할지 등의 설정)
종류
1)ConsoleAppender : 콘솔에 로그 찍기
2)FileAppender : 파일에 로그를 찍기, 최대 보관 일 수 등을 지정할 수 있다.
3)RollingFileAppender : 여러 개의 파일을 롤링, 순회하면서 로그를 찍기. (FileAppender를 상속 받는다. 지정 용량이 넘어간 Log File을 넘버링 하여 나누어 저장할 수 있다.)
4)DBAppender : DB(데이터베이스)에 로그를 찍기.
logger, root
설정한 appender를 참조하여 package와 level을 설정한다.
level 설정을 통해서 출력할 레벨을 정할 수 있다. 지정 레벨 밑은 출력하지 않는다. 기본은 디버그 레벨로 되어 있다.
root(전역 설정)
logger(지역 설정)
encorder
로그 이벤트를 바이트 배열로 변화하고 해당 바이트 배열을 outputstream에 쓰는 작업을 담당한다.
appender에 포함되어 사용자가 지정한 형식으로 표현될 로그 메세지로 변환하는 역할을 한다.
사용되는 패턴
%Logger{length} : Logger name을 축약할 수 있다. {length}는 최대 자리 수, ex)logger{35}
%-5level : 로그 레벨, -5는 출력의 고정폭 값(5글자)
%msg : - 로그 메시지 (=%message)
${PID:-} : 프로세스 아이디
%d : 로그 기록시간
%p : 로깅 레벨
%F : 로깅이 발생한 프로그램 파일명
%M : 로깅일 발생한 메소드의 명
%l : 로깅이 발생한 호출지의 정보
%L : 로깅이 발생한 호출지의 라인 수
%thread : 현재 Thread 명
%t : 로깅이 발생한 Thread 명
%c : 로깅이 발생한 카테고리
%C : 로깅이 발생한 클래스 명
%m : 로그 메시지
%n : 줄바꿈(new line)
%% : %를 출력
%r : 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)
부가적 설정 요소
- file: 기록할 파일명과 경로를 설정
- rollingPolicy : 파일 순환 규칙을 설정할 수 있다. 일자별 적용, 일자별+크기별 적용 가능
- fileNamePattern파일 쓰기가 종료된 log 파일 명의 패턴을 지정한다..gz나 .zip으로 자동으로 압축도 가능하다.
- maxFileSize: 한 파일당 최대 파일 용량을 지정한다.
- maxHistory: 저장 일수를 지정할 수 있다.
- Filter : 필터링으로 원하는 로그 레벨만 찍을 수 있도록 설정 가능하다
Logback 설정 파일 작성, 등록하기
실제 Logback 실제 작성을 통해, 아래 요구 사항을 해결해보자.
- 콘솔을 내가 원하는 형식으로 출력하자
- 파일에 WARN이상의 레벨만 저장할 수 있도록 하자
- 원하지 않는 내가 설정하지 않은 로거 중에 원하지 않은 로거를 설정하자 logger설정을 통해 해당 로거는 해당 레벨 이상만 출력될 수 있도록하자 .
src\main\resources\logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" scanPeriod="10 seconds">
<!-- 콘솔에 출력할 appender 설정 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 내가 원하는 출력 패턴을 결정하기 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-4relative] %green([%thread]) %highlight(%-5level)
%logger
%boldWhite([%C.%M:%yellow(%L)]) - %msg%n</pattern>
</encoder>
</appender>
<!-- appender 파일로 로그 남기기 작성 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>./errorLog/error_log.%d{yyyy-MM-dd}</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<charset>UTF-8</charset>
<Pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Pattern>
</encoder>
<!-- 필터를 통해서 warn 이상만 저장할 수 있게 설정 -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>WARN</level>
</filter>
</appender>
<!-- 기본 출력을 info로 하여 -->
<!-- 내가 만든 로거 등록하기 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</root>
<!-- logger name(package) level을 지정해서 출력 레벨 설정 -->
<!-- 내가 설정한 로거가 아니면 warn 이상만 출력되도록 설정하기 -->
<logger name="com.example.apideliveryservice.ApiDeliveryServiceApplication" level="warn"/>
<logger name="org.hibernate.validator.internal.util.Version" level="warn"/>
<logger name="org.springframework.boot.devtools.env.DevToolsPropertyDefaultsPostProcessor" level="warn"/>
<logger name="org.springframework.data.repository.config.RepositoryConfigurationDelegate" level="warn"/>
<logger name="org.springframework.web" level="warn"/>
</configuration>
Logback 파일 등록하기
src\main\resources\application.yml
classpath:를 지정해서 내가 만든 logback 설정 파일 등록
logging:
config: classpath:logback.xml
Reference
https://goddaehee.tistory.com/206
'Web Sever 개발과 CS 기초 > 스프링' 카테고리의 다른 글
자바 예외에 대한 이해 (0) | 2023.04.26 |
---|---|
Spring을 사용한 JDBC 예외 누수 문제 해결하기 (0) | 2023.04.26 |
Spring Transaction 전파 이해하기 (0) | 2023.04.26 |
스프링 Trasaction AOP 동작 과정과 주의 사항 (0) | 2023.04.26 |
JDBC Trasaction문제 Spring으로 해결하기 (0) | 2023.04.26 |