Spring 개발 환경에 따라 logback 적용

한민기·2024년 8월 3일

Spring

목록 보기
3/8

개발 환경에 따라 다른 log 형식을 지원해야 할 경우가 있습니다.
저는 이전 프로젝트 때 개발 환경에서는 콘솔에서만 로그가 보이길 원하고 배포 환경에서는 파일로 저장 되길 원했습니다. 그래서 logback을 공부해보았습니다.


logback이란

Java 애플리케이션에서 사용되는 로깅 프레임워크입니다. Logback은 성능, 확장성, 유연성을 고려하여 셀계되어있습니다.


log레벨

  1. TRACE:
  • 용도: 가장 상세한 로그 레벨로, 매우 세밀한 정보나 디버깅 목적의 메시지를 기록합니다.
  • 예시: 특정 메서드의 입출력 값을 기록하거나, 상세한 실행 흐름을 추적할 때 사용합니다.
  • 사용 시기: 주로 개발 및 디버깅 단계에서 사용하며, 운영 환경에서는 거의 사용되지 않습니다.
  1. DEBUG:
  • 용도: 디버깅 목적으로 유용한 정보를 기록합니다. 애플리케이션의 내부 상태나 변수 값을 출력합니다.
  • 예시: 특정 조건에서 변수의 값을 확인하거나, 메서드의 실행 순서를 추적할 때 사용합니다.
  • 사용 시기: 개발 및 테스트 단계에서 주로 사용합니다.
  1. INFO:
  • 용도: 일반적인 정보성 메시지를 기록합니다. 애플리케이션의 정상적인 운영 상태를 나타냅니다.
  • 예시: 애플리케이션 시작, 종료, 중요한 설정 변경, 주요 이벤트 발생 등을 기록합니다.
  • 사용 시기: 운영 환경에서도 사용되며, 시스템의 주요 이벤트를 모니터링할 때 유용합니다.
  1. WARN:
  • 용도: 주의가 필요한 경고 메시지를 기록합니다. 심각하지 않지만, 잠재적인 문제나 비정상적인 상태를 나타냅니다.
  • 예시: 메모리 사용률이 높아지거나, 설정이 올바르지 않은 경우, 오래 걸리는 작업 등이 포함됩니다.
  • 사용 시기: 운영 환경에서 문제를 미리 파악하고 대응하기 위해 사용합니다.
  1. ERROR:
  • 용도: 오류가 발생했음을 나타내는 메시지를 기록합니다. 애플리케이션의 기능에 영향을 미치는 심각한 문제를 나타냅니다.
  • 예시: 예외 발생, 데이터베이스 연결 실패, 중요한 기능의 실패 등을 기록합니다.
  • 사용 시기: 운영 환경에서 중요한 문제를 파악하고 즉각적인 대응이 필요할 때 사용합니다.
  1. FATAL (Logback에는 기본적으로 포함되지 않음, 다른 로깅 프레임워크에서 사용 가능):
  • 용도: 치명적인 오류를 기록합니다. 애플리케이션이 중단되거나 정상적인 기능을 수행할 수 없는 상태를 나타냅니다.
  • 예시: 시스템 전체의 중단을 초래하는 심각한 문제를 기록합니다.
  • 사용 시기: 애플리케이션의 즉각적인 중단이나 재시작이 필요한 경우 사용합니다.

로그의 순서 는 TRACE < DEBUG < INFO < WARN < ERROR < FATAL 입니다.


logback-spring.xml 파일 위치

예시와 같이
src -> main -> resources -> logback-spring.xml
에 위치합니다.

logback의 개발 환경 분리

저는 개발 환경을 dev와 prod로 나누어 관리하였습니다.
그래서 dev 사용할 경우와 prod를 사용할 경우를 나누어 관리하였습니다.

<springProfile name="dev">
~
</springProfile>
<springProfile name="prod">
~
</springProfile>

springProfile 기능을 활용해 dev와 prod일 경우를 나눴습니다.

logback의 보여줄 로그 설정

먼저 개발 환경에서의 설정을 보여드리겠습니다.
저는 기본 spring로그에 익숙하여 spring가 보이도록 설정하고
로그의 레벨은 info로 설정하였습니다.

 <springProfile name="dev">
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
 </springProfile>

배포 환경에서는 spring 로그를 콘솔에서 사용하고 파일로 저장, error는 또 파일로 추가로 저장하는 방법을 사용했다.

<configuration>
    <springProperty scope="context" name="LOG_DIR" source="log.directory" />
    <timestamp key="BY_DATE" datePattern="yyyy-MM-dd" />
<configuration>

application.yml 파일에 log 파일의 저장 위치를 먼저 불러왔다.

log:
  directory: logs/prod
 <springProfile name="prod">
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_DIR}/error/error-${BY_DATE}.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_DIR}/backup/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxFileSize>100MB</maxFileSize>
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>

        <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_DIR}/info/info-${BY_DATE}.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_DIR}/backup/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxFileSize>100MB</maxFileSize>
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <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="FILE-ERROR" />
            <appender-ref ref="FILE-INFO" />
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

root level를 조절하여 내가 원하는 log의 level을 1차로 설정할 수 있습니다.
appender에서 file을 통해 저장할 파일의 이름,
filter를 통해 level,
encoder을 통해 저장할 로그의 형태,
rollingPoilcy를 통해 back로그 관련 설정을 하였습니다.

최종 파일

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <springProperty scope="context" name="LOG_DIR" source="log.directory" />
    <timestamp key="BY_DATE" datePattern="yyyy-MM-dd" />

    <springProfile name="dev">
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
        <root level="INFO">
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>

    <springProfile name="prod">
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />

        <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_DIR}/error/error-${BY_DATE}.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>ERROR</level>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_DIR}/backup/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxFileSize>100MB</maxFileSize>
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
            </encoder>
        </appender>
        

        <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_DIR}/info/info-${BY_DATE}.log</file>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_DIR}/backup/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                <maxFileSize>100MB</maxFileSize>
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
            <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="FILE-WARN" />
            <appender-ref ref="FILE-INFO" />
            <appender-ref ref="CONSOLE" />
        </root>
    </springProfile>
</configuration>

정리

  • springProfile 기능을 통해 개발 환경에 따라 구분하여 log를 관리할 수 있다.
  • appender 기능을 통하여 log를 파일로 저장할 수 있다.
  • rollingPolicy 정책을 통하여 backup도 설정할 수 있다.
  • log 는 level이 있다.
  • level 설정으로 보여주거나 저장할 로그를 설정할 수 있다.

더 나아가기

저는 프로젝트를 진행할 때 MSA기반의 서버를 분리하여 개발을 진행했습니다. 그러면 만약 로그를 보기 위해서 각각의 서버를 들어가 파일을 보아야 하는 문제가 발생하였습니다. 이러한 문제를 해결하기 위해 여러가지를 찾아보니 Log & Crash란 기능이 있었습니다.
다음 글은 NHN의 LOG & Carsh 까지 사용하여 로그를 관리하는 방법을 올리도록 하겠습니다.

profile
백엔드 개발자

0개의 댓글