본문 바로가기

Spring

Spring Boot Logback 설정

 

보통의 프로젝트에 log에 대한 properties는 이미 설정 되어 있는 경우가 많다.

필자의 경우도 기본적으로 세팅되어 있는 경우를 많이 사용하며 이후 해당 설정을 다시 활용하는 경우가 많다.

 

이번 기회에 Log에 대한 정리와 함께 프로젝트에 적용하였다

 

이전 포스팅에서 로그에 대한 정리를 진행했다.

https://daliy-dev.tistory.com/31

 

Log4j, Logback, Log4j2

로그(Log)란? 소프트웨어 실행중 발생되는 행위와 상태 및 동작정보를 시간 경과에 따라 기록하는 데이터를 일컫는 말이다. 이러한 로그를 생성하는 과정을 "로깅(Logging)"이라 한다. Java에서는 다

daliy-dev.tistory.com

 

 

프로젝트 구성

- spring boot 

 

현재 구성하고있는 채팅 서버는 부트로 구현하고 있으며 이전에는 application.yml에 간단하게 설정하여 로그를 진행하였다.

 

spring-boot-starter 사용함으로써 내장되어있는 logback을 사용할수 있었다.

 

 

 

간단한 구성

 

처음은 yml파일 기준으로 local, test, prod를 나누어 해당 yml 내용에 로깅 정보를 적용했다.

application.yml
application-test.yml

 

일단 간단하게 설정하며 공통과 yml을 설정하여 처리했다.

 

이렇게 설정하면 간단하게 처리할 수 있지만 단점도 존재한다.

 

필자같은 경우는 yml에 정보가 늘어날수록 해당 정보들을 찾는데 또 각 버전에 따라 따로 관리해야하는 문제점이 있었다.

이를 좀 더 응집도 있게 처리하기 위해 logback.xml을 설정했다.

 

 

 

logback.xml 처음 작성 하였을 때는 profile.active 상태에 따라 로그가 설정되게 만들었다.

 

이렇게 되면 중복된 내용이 자주 사용되는 아쉬움이 있고, 이러한 점을 보완하고자 다른 방법을 찾아보니 profile 전략이 있었다.

 

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">

    <!-- log 기록 위치 설정 -->
    <property name="LOGS_ABSOLUTE_PATH" value="./logs" />

    <!-- 로그 패턴에 색상 적용 %clr(pattern){color} -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

    <!-- log 변수 값 설정 -->
    <property name="CONSOLE_LOG_PATTERN"  value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%thread] [%logger{0}:%line] [%X{request_id:-startup}] - %msg%n"/>

    <!-- log file 변수 값 설정 -->
    <property name="FILE_LOG_PATTERN"  value="%d{yyyy-MM-dd HH:mm:ss} [%-5level] [%thread] [%logger{0}:%line] [%X{request_id:-startup}] - %msg%n"/>

    <!-- 콘솔(CONSOLE) -->
    <springProfile name="console-logging">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            </layout>
        </appender>
    </springProfile>

    <springProfile name="file-logging">
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOGS_ABSOLUTE_PATH}/web-chat.log</file>
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    </springProfile>

    <root level="info">

        <springProfile name="console-logging">
            <appender-ref ref="CONSOLE"/>
        </springProfile>

        <springProfile name="file-logging">
            <appender-ref ref="FILE"/>
        </springProfile>

    </root>

</configuration>

 

위 처럼 spring profile에 콘솔(console-logging), 파일(file-logging)과 같은 두가지 상태의 모듈을 만들었다 생각하면 된다.

 

이를 필요 레벨에따라 profile을 추가해주면 된다.

 

apllication.yml
aplication-local.yml

 

위 처럼 적용하니 실제 서비스가 올라가지않는 버그가 있었다 해당 이유를 찾아보니 spring 2.4 부터는 변경된 프로퍼티 구성 파일 방식이 적되었다.

 

하여 아래 설정을 추가하니 동작하였다

apllication.yml

 

 

이 방식보다는 새로운 프로퍼티 구성 파일 방식을 적용하기로 하였고

apllication.yml

 

위 처럼 프로프티를 설정함으로써 로컬, 테스트, 운영에 따른 로깅 모듈을 설정하여 진행했다. 이렇게 진행하면 변화없이 확장에 유용하다고 생각한다. 

 

스프링부트를 이용하여 SLF4J 인터페이스를 이용하여 언제든 로그를 변경하여 적용할 수있으며 실제 실무에서는 많은 로그량이 쌓일 것이고 그에 따른 전략도 여러가지고 존재한다.

 

기본적으로 로그 저장 정책으로는

SizeAndTimeBasedRollingPolicy, TimeBasedRollingPolicy 등 알맞은 전략을 사용해주며 비동기 전략도 추가 할 수 있을거 가 같다.

 

기존에 사용되고있는 logback보다 log4j2가 성능면으로 뛰어나다 한다


개인적으로 구현하고있는 프로젝트는 대중적인것을 사용하는것이 좋다 판단하여 위처럼 진행했다.

 

이제는 로그 설정이 끝냈으니 프로젝트 내용에 더 집중해보자