본문 바로가기

Spring

개발 환경에 따른 log 분리

728x90

1.application-local.yml

spring:
  config:
    activate:
      on-profile: local

logging:
  level:
    root: info

 

local에서 쓰일 설정들을 application-local.yml에 선언합니다.

2.application-prod.yml

spring:
  config:
    activate:
      on-profile: prod

logging:
  level:
    root: info

prod에서 쓰일 설정들을 application-local.yml에 선언합니다.

3.application.yml

spring:
  profiles:
    active: prod

 

구성편집 ->활성화된 프로파일

 

어떠한 개발환경이 쓰일지는 application.yml의 spring.prfile.active에서 선언하거나 intellij에서 구성편집에 들어가 활성화된 프로파일을 원하는 개발환경에 맞게 설정합니다. intellij의 개발환경이 먼저 적용되므로 주의하여 사용합니다.

 

4.logback-spring.xml

(1) include 선언

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
</configuration>

 

console log는 springboot에서 기본 제공하는 포맷을 사용하기 위해 defaults.xml과 console-appender.xml을 include해줍니다.

(2) property 설정

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<!-- 로그 파일이 저장될 경로 -->
    <property name="LOG_INFO_PATH" value="./log/info"/>
    <property name="LOG_WARN_PATH" value="./log/warn"/>
    <property name="LOG_ERROR_PATH" value="./log/error"/>

    <property name="LOG_FILE_PATTERN"
              value="%-5level %d{yy-MM-dd HH:mm:ss} [%thread]  [%logger{0}:%line] [id = %X{id}] - %msg%n"/>
    <property name="LOG_LEVEL" value="${logging.level.root}"/>
 </configuration>

 

property를 설정해 ${property_name}으로 xml 파일에서  쓸 수 있습니다.

 

(3)info,warn,error 파일 분리

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<!-- File에  INFO 로그 출력 세팅 -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 레벨 필터 설정 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 출력패턴 설정-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${LOG_FILE_PATTERN}</pattern>
        </encoder>
        <!-- Rolling 정책 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
            <fileNamePattern>${LOG_INFO_PATH}/INFO_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- 파일당 최고 용량 kb, mb, gb -->
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
            <maxHistory>30</maxHistory>
            <!--<MinIndex>1</MinIndex>
            <MaxIndex>10</MaxIndex>-->
        </rollingPolicy>
    </appender>
</configuration>

 

레벨 필터를 설정하여 INFO,WARN,ERROR log만 볼 수 있도록 설정합니다.

Rolling 정책은 일자별로 log 파일을 볼 수 있고 일정량의 사이즈가 넘어가면 새로운 log파일을 만들어 관리하기 쉽게 만들어 줍니다. 또, 로그파일의 최대 보관주기도 설정 할 수 잇습니다.

(4) 개발환경에 따른 분리

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
	<root level="${LOG_LEVEL}">
        <!-- 위에 설정한 콘솔 설정 추가 -->
        <springProfile name="local">
            <appender-ref ref="CONSOLE"/>
        </springProfile>

        <!-- 위에 설정한 파일 설정 추가 -->
        <springProfile name="prod">
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="WARN_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </springProfile>
    </root>
</configuration>

 

xml의 springProfile을 이용하여 local,prod를 분리 할 수 있고 appender-ref를 이용하여 위에서 설정한 것들을 추가시킬 수 있습니다.

 

(5) logback-spring.xml

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

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

    <!-- 로그 파일이 저장될 경로 -->
    <property name="LOG_INFO_PATH" value="./log/info"/>
    <property name="LOG_WARN_PATH" value="./log/warn"/>
    <property name="LOG_ERROR_PATH" value="./log/error"/>

    <property name="LOG_FILE_PATTERN"
              value="%-5level %d{yy-MM-dd HH:mm:ss} [%thread]  [%logger{0}:%line] [id = %X{id}] - %msg%n"/>
    <property name="LOG_LEVEL" value="${logging.level.root}"/>

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

        INFO 일 경우 INFO 보다 위에 있는 DEBUG와 TRACE는 표시하지 않는다.
    -->
    <springProfile name="prod">
    <!-- File에  INFO 로그 출력 세팅 -->
        <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 레벨 필터 설정 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>INFO</level>
                <onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
                <onMismatch>DENY</onMismatch>
            </filter>
            <!-- 출력패턴 설정-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${LOG_FILE_PATTERN}</pattern>
            </encoder>
            <!-- Rolling 정책 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
                <fileNamePattern>${LOG_INFO_PATH}/INFO_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!-- 파일당 최고 용량 kb, mb, gb -->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
                <maxHistory>30</maxHistory>
                <!--<MinIndex>1</MinIndex>
                <MaxIndex>10</MaxIndex>-->
            </rollingPolicy>
        </appender>

        <!-- File에  WARN 로그 출력 세팅 -->
        <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 레벨 필터 설정 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
                <onMismatch>DENY
                </onMismatch> <!-- 다른 수준의 레벨은 기록하지 않는다.(상위 레벨도 기록 안함), 상위 수준의 레벨에 대한 기록을 원하면 ACCEPT 로 하면 기록된다. -->
            </filter>
            <!-- 출력패턴 설정-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${LOG_FILE_PATTERN}</pattern>
            </encoder>
            <!-- Rolling 정책 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
                <fileNamePattern>${LOG_WARN_PATH}/warn_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!-- 파일당 최고 용량 kb, mb, gb -->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
                <maxHistory>30</maxHistory>
                <!--<MinIndex>1</MinIndex>
                <MaxIndex>10</MaxIndex>-->
            </rollingPolicy>
        </appender>

        <!-- File에  ERROR 로그 출력 세팅 -->
        <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!-- 레벨 필터 설정 -->
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch> <!-- 해당 레벨만 기록한다. -->
                <onMismatch>DENY</onMismatch>
            </filter>
            <!-- 출력패턴 설정-->
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${LOG_FILE_PATTERN}</pattern>
            </encoder>
            <!-- Rolling 정책 -->
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
                <fileNamePattern>${LOG_ERROR_PATH}/error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <!-- 파일당 최고 용량 kb, mb, gb -->
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
                <maxHistory>30</maxHistory>
                <!--<MinIndex>1</MinIndex>
                <MaxIndex>10</MaxIndex>-->
            </rollingPolicy>
        </appender>
    </springProfile>

    <root level="${LOG_LEVEL}">
        <!-- 위에 설정한 콘솔 설정 추가 -->
        <springProfile name="local">
            <appender-ref ref="CONSOLE"/>
        </springProfile>

        <!-- 위에 설정한 파일 설정 추가 -->
        <springProfile name="prod">
            <appender-ref ref="INFO_FILE"/>
            <appender-ref ref="WARN_FILE"/>
            <appender-ref ref="ERROR_FILE"/>
        </springProfile>
    </root>

</configuration>

 

5. 결과

(1) local

local console log

(2) prod

prod log file

728x90

'Spring' 카테고리의 다른 글

MDC 및 로그레벨에 따른 로그파일 분리  (1) 2023.11.14
Pinpoint Cloud  (0) 2023.11.13
Spring Restdocs  (0) 2023.11.10
그라파나 설치 및 사용법  (0) 2023.11.07
프로메테우스 설치 및 사용법  (1) 2023.11.07