본문 바로가기
Spring

Spring boot 환경 logback 날짜별 디렉토리 분리

by yang sing 2024. 6. 1.

안녕하세요. 

지난 포스팅에서 Spring boot 환경의 logback 설정에 대해서 간단하게 포스팅을 했었습니다.

이번에는 제가 회사에서 클라이언트의 요청에 따라 로그를 날짜별로 저장을 하는 방식에 대해서 작성하려고 합니다.

어쩌면 너무 간단하고 단순한 설정이지만 매번 써오던 설정이 아니여서 그런지 실수를 했던 부분에 대해서 잊지 않으려고 

제가 어떤 문제에 직면 했었고 어떻게 해결했는지에 대해서 작성하고자 합니다. 

 

클라이언트 요청 사항 

기존에 제가 사용했던 logback 설정은 '어플리케이션 실행 경로/logs/' 의 경로에서 'application.log - 현재 쌓이고 있는 로그 파일'과

application-2023-05-31.log' 등 하나의 로그 디렉토리에서 날짜별로 로그를 저장하는 설정으로 사용해왔습니다.

 

이번에 클라이언트측에서는 '/application/log/20240530/application.log', '/application/log/20240531/application.log' 와 같이 

어플리케이션이 실행되는 상대 경로가 아니라 서버의 절대 경로에 '/application/log/' 경로를 생성하고 해당 디렉토리 내부에서 날짜별로 로그 파일이 생성되기를 원했습니다.

날짜별로 디렉토리 생성 설정

먼저 날짜별로 log를 생성하게 해주었던 RollingFileAppender append 태그에서 설정을 변경해보도록 하겠습니다.

<!--로그 파일 저장 위치-->
<property name="LOGS_PATH" value="/application/logs/%d{yyyyMMdd}"/>
<!--로그 파일 rolling 저장 -->
    <appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 기본 로그 파일명 설정 --> 
        <file>${LOGS_PATH}/application.log</file>
        
        <!-- 로그를 남길 패턴 설정 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35}[%line] - %msg%n</pattern>
        </encoder>
        
        <!-- 로그 파일을 일자, 크기 별로 생성 설정 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_PATH}/application-logging-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>60</maxHistory>
        </rollingPolicy>
    </appender>

저는 단순하게 property의 LOGS_PATH의 value를 절대 경로 디렉토리 설정과 %d{yyyyMMdd} 경로를 생성해주면

자동으로  '/application/log/20240530/application.log'의 경로가 생성이 될것으로 예상을 했었습니다.

그러나 해당 프로그램을 서버에서 동작 시켜본 결과  '/application/log/'%d{yyyyMMdd}'/application.log'라는 경로의 로그 파일이 생성이 되었고 왜 %d{yyyyMMdd}가 날짜형식으로 변환이 안되는지 이해를 하지 못했습니다.

 

timestamp 태그 사용

LOGS_PATH에서 %d{yyyyMMdd}의 문법이 적용되지 않는다는 부분을 확인을 했었고 logback 옵션 중에 timestamp 태그가 생각이 나서 해당 태그를 사용을 해 봤습니다.

<!--로그 파일 저장 위치-->
<timestamp key="today" datePattern="yyyyMMdd"/>
<property name="LOGS_PATH" value="/application/logs/${today}"/>
<!--로그 파일 rolling 저장 -->
    <appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 기본 로그 파일명 설정 --> 
        <file>${LOGS_PATH}/application.log</file>
        
        <!-- 로그를 남길 패턴 설정 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35}[%line] - %msg%n</pattern>
        </encoder>
        ...
    </appender>

위와 같이 설정을 한 뒤 프로그램을 서버에서 구동 시켜서 로그를 확인해보니 '/application/log/20240530/application.log'가 정상적으로 생성이 되는것을 확인했고 해당 프로그램을 구동 시켜둔 상태로 다음날 확인을 했을 때 '/application/log/20240531/application.log'가 생성될 것으로 예상을 하고 퇴근을 했었습니다.

 

그러나 다음날 확인해본 결과 '/application/log/20240530/' 어제자 경로에 오늘자 로그 파일이 생성되었고 클라이언트의 요청에 맞는 로그 경로가 아니라는 것을 확인했습니다.

 

해결

저는 logback 설정의 각 태그들에 대해서 좀 더 깊게 생각을 해봤습니다. 

어떻게 동작을 해나가는지 클라이언트 요구 사항에 맞게 설정을 하려면 어떤 설정을 수정을 해야하는지 고민하다가 

한가지 생각이 들었습니다.

<file>${LOGS_PATH}/application.log</file> 태그가 현재 실행중인 어플리케이션의 로그가 쌓이는 설정이라면

해당 설정을 없애고 <rollingPolicy> 태그의 <fileNamePattern> 설정만 하게 된다면 현재 실행중인 로그도 여기에 쌓이지 않을까 

하는 생각을 했었습니다.

그래서 아래와 같이 코드를 수정을 진행했습니다.

<!--로그 파일 저장 위치-->
<property name="LOGS_PATH" value="/application/logs"/>
<!--로그 파일 rolling 저장 -->
    <appender name="DAILY_ROLLING_FILE_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">        
        <!-- 로그를 남길 패턴 설정 -->
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35}[%line] - %msg%n</pattern>
        </encoder>
        
        <!-- 로그 파일을 일자, 크기 별로 생성 설정 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOGS_PATH}/%d{yyyyMMdd}/application.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>60</maxHistory>
        </rollingPolicy>
    </appender>

<file> 태그를 지우고 LOGS_PATH의 값에 절대경로의 변하지 않는 경로 '/application/logs'를 설정한 뒤

<fileNamePattern> 태그에서 해당 ${LOGS_PATH}/%d{yyyyMMdd}/ 경로를 지정해줬습니다.

 

결과는 클라이언트가 요구한대로  '/application/log/20240530/application.log' 오늘 날짜로 현재 실행중인 로그가 생성이 되었으며

다음날 확인을 해본 결과  '/application/log/20240531/application.log' 디렉토리가 생성이 되며 새로운 로그 파일이 생성 되는 것을 확인했습니다.

 

어쩌면 너무 당연하고 너무 간단한 설정인데 저는 제가 매번 설정했던 하나의 디렉토리에 날짜별로 로그를 저장하는 방식만을 해오다보니

아니 logback의 개념과 각 설정들의 동작 방식에대한 이해도가 떨어져서 간단한 설정에도 불구하고 시간을 많이 잡아먹었던 경험이였습니다.

 

이번 설정으로 인해 부족하지만 조금이라도 더 logback의 개념과 각 설정들에 대해서 배울 수 있는 좋은 시간이 되었다고 생각을 하고 있습니다.

 

오늘도 글을 읽어주셔서 감사합니다.