Web/Backend

[Backend] Logback 설정

meizzi 2024. 9. 11. 16:20
728x90
반응형
항상 개발을 하면서 로그를 잘 볼 수 있어야 한다.
서버를 킨 후 시스템의 상태와 동작 정보를 시간 경과에 따라 기록함으로써 개발 과정에서 발생한 문제를 확인할 수 있고 다양한 정보를 수집할 수 있다.

1. Logback

  • Java에서 가장 많이 사용하던 로깅 라이브러리인 log4j의 후속 버전
  • SLF4j의 구현체로 Spring Boot라면 별도의 dependency 추가 없이 기본적으로 포함되어 있다.
  • Logback Log4j에 비해 향상된 필터링 정책, 기능, 로그 레벨 변경 등에 대해 서버를 재시작할 필요 없이 자동 리로딩을 지원하고 성능이 전반적으로 뛰어나다.

2. Log Level

  • 총 5가지의 log level
    • ERROR - WARN - INFO - DEBUG - TRACE 순으로 심각도가 높아진다.
  • ERROR
    • 요청을 처리하는 도중 예상하지 못한 문제(오류)가 발생한 경우 표시
  • WARN
    • 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리
    • 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지 표시
  • INFO
    • 운영에 참고할만한 사항
    • 상태 변경과 같은 정보성 로그 표시
  • DEBUG
    • SQL 로깅 가능 (개발 단계에서 사용)
    • 프로그램을 디버깅하기 위한 정보 표시
  • TRACE
    • 모든 레벨에 대한 로깅 추적 (개발 단계에서 사용)
예를 들어 INFO 레벨로 설정하면 DEBUG, TRACE 레벨은 출력하지 않는다.

3. Logback 패턴

  • %logger{length}
    • Logger name 축약 가능
    • {length}는 최대 글자 수
    • ex) logger{35}
  • %-5level
    • 로그 레벨
    • -5는 출력의 고정폭 값(5글자)
  • %msg
    • 로그 메세지(=%message)
  • ${PID:-}
    • 프로세스 아이디
  • %d
    • 로그 기록시간
  • %p
    • 로깅 레벨
  • %F
    • 로깅이 발생한 프로그램 파일명
  • %M
    • 로깅일 발생한 메소드의 명
  • %I
    • 로깅이 발생한 호출지의 정보
  • %L
    • 로깅이 발생한 호출지의 라인 수
  • %thread
    • 현재 Thread 명
  • %t
    • 로깅이 발생한 Threrad명
  • %c
    • 로깅이 발생한 카테고리
  • %C
    • 로깅이 발생한 클래스 명
  • %m
    • 로그 메세지
  • %n
    • 줄바꿈
  • %%
    • %를 출력
  • %r
    • 애플리케이션 시작 이후 부터 로깅이 발생한 시점 까지의 시간(ms)

4. Logback 설정

  • Logback을 따로 설정하지 않으면 default는 INFO 레벨로 설정
  • src/main/resources/logback-spring.xml에 설정
  • 로그 패턴, 색상, 저장 여부(콘솔, 파일) 등 설정 가능
  • 파일 크기에 따라 파일 분할 가능
  • 파일 저장 기간에 따라 파일 삭제 가능
  • profile에 따라 Logback 설정 가능
    • 어느 레벨까지 찍을지와 파일 저장 여부 설정
    • local 환경에서는 파일 필요 없으니까 콘솔에만 출력
    • dev | stg | prod 환경에서는 콘솔은 안보니까 파일에만 출력
    • prod 환경에서 INFO 레벨까지 찍으면 사용자가 많은 경우 로그 용량이 너무 커지니까 ERROR까지만 출력
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
	<!-- 로그 패턴, 색상 설정 -->
    <conversionRule conversionWord="applicationName" converterClass="org.springframework.boot.logging.logback.ApplicationNameConverter" />
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="correlationId" converterClass="org.springframework.boot.logging.logback.CorrelationIdConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr(%applicationName[%15.15t]){faint} %clr(${LOG_CORRELATION_PATTERN:-}){faint}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="CONSOLE_LOG_CHARSET" value="${CONSOLE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
    <property name="CONSOLE_LOG_THRESHOLD" value="${CONSOLE_LOG_THRESHOLD:-TRACE}"/>
    <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- %applicationName[%t] ${LOG_CORRELATION_PATTERN:-}%-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="FILE_LOG_CHARSET" value="${FILE_LOG_CHARSET:-${file.encoding:-UTF-8}}"/>
    <property name="FILE_LOG_THRESHOLD" value="${FILE_LOG_THRESHOLD:-TRACE}"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <!--로그를 콘솔에 출력하기 위한 Appender -->
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 로그를 여러 파일에 나눠서 저장하기 위한 Appender -->
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!-- 로그 파일 정책 -->
            <fileNamePattern>./log/%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!--파일명 -->
            <maxFileSize>30MB</maxFileSize> <!-- 해당 용량을 초과했을 시 다음 파일에 작성-->
            <maxHistory>30</maxHistory> <!-- 30일이 지나면 삭제 -->
        </rollingPolicy>
    </appender>

    <springProfile name="local"> <!-- local 환경일 경우 콘솔에서만 로그 출력 -->
        <logger name="com.example.paymentsystem" level="DEBUG" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>
    <springProfile name="dev|stg"> <!-- dev, stg 환경일 경우 INFO 레벨의 로그를 파일로 저장 -->
        <root level="INFO">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>
    <springProfile name="prod"> <!-- prod 환경일 경우 ERROR 레벨의 로그를 파일로 저장 -->
        <root level="ERROR">
            <appender-ref ref="FILE" />
        </root>
    </springProfile>

</configuration>
728x90
반응형

'Web > Backend' 카테고리의 다른 글

[Backend] Multi Profile 설정  (0) 2024.09.11
[Backend] Swagger 설정  (1) 2024.09.11
[Spring] @Controller와 @RestController  (0) 2024.01.05
[SpringBoot] sts4 프로젝트 생성  (0) 2024.01.04