Springboot

Springboot logback 적용

Railly Linker 2024. 10. 16. 08:18

- springboot logback 이란, 스프링부트 프로세스에서 발생하는 로그들의 형식을 정해주는 기능입니다.

예를들어 test 라는 로그를 남길 때,

import org.slf4j.Logger
import org.slf4j.LoggerFactory

private val classLogger: Logger = LoggerFactory.getLogger(this::class.java)


fun test(){
	classLogger.info("test")
}

 

위와 같이 로깅을 하는데,

의도대로라면 로그에 "test" 만 찍혀야 하겠죠?

 

하지만 운영 단계에서는 해당 로그가 찍힌 시간, 로그의 중요도, 실행된 스레드가 무엇인지 등을 자동으로 로깅하고 싶을 수도 있습니다.

그렇다면 위와 같은 로깅 코드마다 각 정보를 일일이 넣어줘야 하는데, logback 을 설정하면 이러한 정보가 자동으로 입력됩니다.

 

그뿐아니라 로그가 콘솔창 외에도 파일로 저장되게도 할 수 있고, 파일 저장이라면 파일의 크기가 몇 이상이면 파일을 분할하게 할 수도 있고, 로그 파일명의 규칙이나 저장 위치도 설정이 가능하며,

Slack, 이메일 등으로 로그가 발송되도록 할 수도 있습니다.

 

이번 글에서는 기본적으로 로그를 콘솔에 출력할 때의 양식과 파일로 출력될 때의 설정,

그리고 Springboot 프로필 설정별 로깅 방식 변경에 대한 처리 방법을 정리하겠습니다.

 

- 실습은 간단합니다.

application.yml 파일이 존재하는 resources 폴더 안에, logback-spring.xml 파일을 만들고,

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--
        [로그 패턴]
        1. yyyy_MM_dd... : 현재 일시
        2. %relative : 서버가 시작된 이후의 밀리초
        3. %level : 로그 레벨
        4. %thread : 사용 쓰레드
        5. %logger : 사용 로거
        6. %msg : 로깅 메시지
    -->

    <!--로그 파일 저장 위치-->
    <property name="LOGS_PATH" value="./by_product_files/test/logs"/>


    <!--local 프로필 환경-->
    <springProfile name="local">
        <!-- File 에 로그 출력 세팅 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 출력패턴 설정-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <charset>UTF-8</charset>
                <pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%-5level] [%msg] [le]%n
                </pattern>
            </encoder>

            <!-- Rolling 정책 : 로그 보관 정책 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 로그 백업 파일 경로 설정 -->
                <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
                <fileNamePattern>${LOGS_PATH}/local_%d{yyyy_MM_dd}(%i).log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
                    <!-- 파일당 최고 용량 KB, MB, GB -->
                    <!-- 아래 용량을 넘으면 파일 분할-->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>

        <!-- CONSOLE 에 로그 출력 세팅 -->
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%highlight(%-5level)] [%msg] [le]%n
                </pattern>
            </layout>
        </appender>

        <!--        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
        <!--            &lt;!&ndash; 로그 스태시 주소 &ndash;&gt;-->
        <!--            <destination>localhost:5000</destination>-->
        <!--            <encoder class="net.logstash.logback.encoder.LogstashEncoder">-->
        <!--            </encoder>-->
        <!--        </appender>-->

        <!-- appender 별 세팅 -->
        <!-- 로그 전역 세팅 -->
        <!-- 로그 레벨 -->
        <!--
            1) ERROR : 오류 메시지 표시
            2) WARN  : 경고성 메시지 표시
            3) INFO  : 정보성 메시지 표시
            4) DEBUG : 디버깅하기 위한 메시지 표시
            5) TRACE :  Debug보다 훨씬 상세한 메시지 표시

            예를들어 info 로 설정시, INFO 보다 위에 있는 DEBUG 와 TRACE 는 표시하지 않는다.
        -->
        <root level="INFO">
            <appender-ref ref="FILE"/>
            <appender-ref ref="CONSOLE"/>
            <!--            <appender-ref ref="LOGSTASH"/>-->
        </root>
    </springProfile>


    <!--dev 프로필 환경-->
    <springProfile name="dev">
        <!-- File 에 로그 출력 세팅 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 출력패턴 설정-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <charset>UTF-8</charset>
                <pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%-5level] [%msg] [le]%n
                </pattern>
            </encoder>

            <!-- Rolling 정책 : 로그 보관 정책 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 로그 백업 파일 경로 설정 -->
                <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
                <fileNamePattern>${LOGS_PATH}/dev_%d{yyyy_MM_dd}(%i).log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
                    <!-- 파일당 최고 용량 KB, MB, GB -->
                    <!-- 아래 용량을 넘으면 파일 분할-->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>

        <!--        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
        <!--            &lt;!&ndash; 로그 스태시 주소 &ndash;&gt;-->
        <!--            <destination>localhost:5000</destination>-->
        <!--            <encoder class="net.logstash.logback.encoder.LogstashEncoder">-->
        <!--            </encoder>-->
        <!--        </appender>-->

        <!-- appender 별 세팅 -->
        <!-- 로그 전역 세팅 -->
        <!-- 로그 레벨 -->
        <!--
            1) ERROR : 오류 메시지 표시
            2) WARN  : 경고성 메시지 표시
            3) INFO  : 정보성 메시지 표시
            4) DEBUG : 디버깅하기 위한 메시지 표시
            5) TRACE :  Debug보다 훨씬 상세한 메시지 표시

            예를들어 info 로 설정시, INFO 보다 위에 있는 DEBUG 와 TRACE 는 표시하지 않는다.
        -->
        <root level="INFO">
            <appender-ref ref="FILE"/>
            <!--            <appender-ref ref="LOGSTASH"/>-->
        </root>
    </springProfile>


    <!--prod 프로필 환경-->
    <springProfile name="prod">
        <!-- File 에 로그 출력 세팅 -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 출력패턴 설정-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <charset>UTF-8</charset>
                <pattern>[ls] [%23d{yyyy_MM_dd_'T'_HH_mm_ss_SSS_z}] [%-5level] [%msg] [le]%n
                </pattern>
            </encoder>

            <!-- Rolling 정책 : 로그 보관 정책 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- 로그 백업 파일 경로 설정 -->
                <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
                <fileNamePattern>${LOGS_PATH}/prod_%d{yyyy_MM_dd}(%i).log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFileNamingAndTriggeringPolicy">
                    <!-- 파일당 최고 용량 KB, MB, GB -->
                    <!-- 아래 용량을 넘으면 파일 분할-->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>

        <!--        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
        <!--            &lt;!&ndash; 로그 스태시 주소 &ndash;&gt;-->
        <!--            <destination>localhost:5000</destination>-->
        <!--            <encoder class="net.logstash.logback.encoder.LogstashEncoder">-->
        <!--            </encoder>-->
        <!--        </appender>-->

        <!-- appender 별 세팅 -->
        <!-- 로그 전역 세팅 -->
        <!-- 로그 레벨 -->
        <!--
            1) ERROR : 오류 메시지 표시
            2) WARN  : 경고성 메시지 표시
            3) INFO  : 정보성 메시지 표시
            4) DEBUG : 디버깅하기 위한 메시지 표시
            5) TRACE :  Debug보다 훨씬 상세한 메시지 표시

            예를들어 info 로 설정시, INFO 보다 위에 있는 DEBUG 와 TRACE 는 표시하지 않는다.
        -->
        <root level="INFO">
            <appender-ref ref="FILE"/>
            <!--            <appender-ref ref="LOGSTASH"/>-->
        </root>
    </springProfile>

</configuration>

 

위와 같이 입력만 하면 끝입니다.

 

위에서부터 설명하자면,

맨 위의 property 에는 LOGS_PATH 라는 이름의 변수를 생성한 것입니다.

이를 xml 안에서 ${LOGS_PATH} 라는 방식으로 사용 가능합니다.

 

springProfile 은 각각의 name 에 해당하는 프로필이 실행되었을 때 해당 태그 안의 내용을 실행시키겠다는 것으로, 저는 application-local, application-dev, application-prod 라는 프로필이 있으므로, local, dev, prod 라는 설정을 각각 해주었습니다.

 

프로필 태그 안에는 appender 를 설정합니다.

appender 는 로그가 출력될 위치입니다.

FILE appender 는 로그를 파일에, CONSOLE appender 는 로그를 콘솔에 출력하며, 둘 모두 로깅 패턴은 구분이 쉽도록 [ls] 로 시작하여, 날짜, 로그 레벨, 메시지, [le]%n 으로 끝이 납니다.

 

파일의 경우는 10MB 를 넘으면 분할하도록 하였고, 파일명은 프로필_날짜(인덱스).log 라는 형식을 사용하였습니다.

 

마지막으로 위와 같이 생성한 appender 를 root 안에 넣어주면 해당 appender 로 로그가 전달되어 처리되는 것입니다.

자세한 내용은 위 주석을 참고하시고,

이제 더이상 다른 부분을 손대지 마시고 바로 실행을 하시면,

Logback 로깅 완료 결과

 

위와 같이 로그 형식이 잘 변형되었으며,

로그 파일 역시 잘 저장되었음을 볼 수 있습니다.

 

- 이상입니다.