새소식

framework/spring

[Spring] Logback 설정

  • -

Spring Boot Logback 설정

Logback

로깅 프레임워크 중 하나로 SLF4J의 구현체이다.

Logback은 logback-core, logback-classic, logback-access의 3가지 모듈로 나뉜다.
logback-core는 다른 두 모듈을 위한 기반 역할을 한다. AppenderEncoder(Layout) 인터페이스가 속한다.
logback-classic은 core에서 확장된 모듈로, core와 SLF4J API 라이브러리를 가진다. Logger 클래스가 여기에 속한다.
logback-access는 서블릿 컨테이너와 통합되어 HTTP 액세스에 대한 로깅 기능을 제공한다.

Logback을 이용하여 로깅을 수행하기 위해 필요한 주요 설정 요소로는 Logger, Appender, Encoder 3가지가 있다.

Logger

Logger는 실제 로깅을 수행하는 구성요소이다.
ch.pos.logback.classic.Level 클래스에 Logger가 사용 가능한 다섯 가지 레벨(TRACE, DEBUG, INFO, WARN, ERROR)이 정의되어 있다. Level을 통해 출력할 로그의 레벨을 조절할 수 있다. 각 LevelTRACE < DEBUG < INFO < WARN < ERROR이며, 지정한 레벨보다 작은 레벨의 로그는 기록되지 않는다.

ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시
WARN : 처리 가능한 문제, 향후 시스템 에러 원인이 될 수 있는 경고성 메시지 표시
INFO : 상태변경과 같은 정보성 로그 표시
DEBUG : 프로그램을 디버깅하기 위한 정보를 표시
TRACE : Debug보다 훨씬 상세한 정보를 표시

Appender

Appender는 로그 메시지가 출력될 대상을 결정하는 역할을 한다. Appender는 다음과 같은 종류가 있다.

  • ConsoleAppender : 콘솔에 로그 출력
  • FileAppender : 파일 단위로 로그 저장
  • RollingFileAppender : 설정 옵션에 따라 로그를 여러 파일로 나누어 저장
  • SMTPAppender : 로그를 메일로 전송하여 기록
  • DBAppender : 로그를 DB에 저장

Encoder

Encoder는 로그 이벤트를 바이트 배열로 변환하고, 해당 바이트 배열을 Output Stream에 쓰는 작업을 담당한다.
Appender에 포함되어 사용자가 지정한 형식으로 표현 될 로그 메시지를 변환하는 역할을 담당한다.

Spring-Boot Logback Settings

스프링에서 Logback 설정을 위해 logback-spring.xml을 작성할 수 있다.
logback.xml을 사용하게 되면 스프링 설정 전에 Logback 설정이 먼저 완료되어 로그 제어가 어려워질 수 있다.

Dynamic Reloading

dynamic reloading 기능을 지원한다.

<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds">
    <!-- 60초 주기로 파일을 검사하여 바뀌었으면 프로그램을 갱신한다. -->
    <!-- ...logback settings... -->
</configuration>

Appender 설정

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

    <!-- appender 설정 -->
    <!-- ConsoleAppender -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 로그 출력 패턴 설정 -->
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n
            </pattern>
        </encoder>
    </appender>

    <!-- FileAppender -->
    <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 로그를 기록할 파일명과 경로 설정 -->
        <file>./log/info/info-%d{yyyy-MM-dd}.log</file>
        <encoder>
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n
            </pattern>
            <charset>UTF-8</charset>
            <!-- 헤더에 패턴 출력 -->
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>

        <!-- 로그 필터링 설정 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- INFO 레벨의 로그만 파일에 기록 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <!-- Rolling 정책 결정 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 파일 쓰기가 종료된 log 파일명의 패턴 지정. '.gz', '.zip'과 같이 지정하면 자동 압축 -->
            <fileNamePattern>
                ./log/info/info-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <!-- 파일당 최대 용량 -->
            <maxFileSize>10MB</maxFileSize>
            <!-- 로그파일 최대 보관 주기(일). 해당 설정일 이상 지나면 로그파일 자동 삭제 -->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

 <!-- 설정한 appender 적용 -->
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE-INFO"/>
    </root>

</configuration>

Property

  • property : 설정 파일에서 사용될 변수값을 선언한다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

    <!-- property 선언 -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n"/>
    <property name="LOG_CHARSET" value="UTF-8"/>
    <property name="LOG_FILE_PATH" value="./log"/>
    <timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>

    <!-- appender 설정 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- property 사용 -->
            <pattern>${LOG_PATTERN}</pattern>
            <charset>${LOG_CHARSET}</charset>
        </encoder>
    </appender>

    <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- property 사용 -->
        <file>${LOG_FILE_PATH}/info-${BY_DATE}.log</file>
        <encoder>
            <!-- property 사용 -->
            <pattern>${LOG_PATTERN}</pattern>
            <charset>${LOG_CHARSET}</charset>
            <outputPatternAsHeader>true</outputPatternAsHeader>
        </encoder>

        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- property 사용 -->
            <fileNamePattern>${LOG_FILE_PATH}/info-${BY_DATE}.%i.log</fileNamePattern>
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>


    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE-INFO"/>
    </root>

</configuration>

Logger 설정

rootlogger를 통해 설정할 수 있다.

  • root : 전역 설정. 지역 설정인 logger가 선언되면 해당 logger 설정이 default로 적용된다.
  • logger : 지역 설정. 특정 패키지의 logger를 설정할 수 있다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <!-- ...other settings... -->

    <!-- root level 설정 -->
    <root level="info">
    <appender-ref ref="CONSOLE"/>
    </root>

    <!-- 특정 패키지 logging level 설정 -->
    <!-- additivity 값은 root 설정 상속 유무를 결정하는 속성이다. default 값은 true -->
    <logger name="com.example.demo.service" level="debug" additivity="false">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE-INFO"/>
    </logger>

</configuration>

Profile별 설정 분리

srpingProfile을 통해 Profile별로 Logger, Appender 설정을 분리할 수 있다.

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

    <!-- property 선언 -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n"/>
    <property name="LOG_CHARSET" value="UTF-8"/>
    <property name="LOG_FILE_PATH" value="./log"/>
    <timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>

    <!-- 로컬 환경 logger settings -->
    <springProfile name="local">
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <pattern>${LOG_PATTERN}</pattern>
                <charset>${LOG_CHARSET}</charset>
                <outputPatternAsHeader>true</outputPatternAsHeader>
            </encoder>
        </appender>

        <root level="info">
            <appender-ref ref="CONSOLE"/>
        </root>
    </springProfile>

    <!-- 운영 환경 logger settings -->
    <springProfile name="prod">
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_FILE_PATH}/info-${BY_DATE}.log</file>
            <encoder>
                <pattern>${LOG_PATTERN}</pattern>
                <charset>${LOG_CHARSET}</charset>
                <outputPatternAsHeader>true</outputPatternAsHeader>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <!-- property 사용 -->
                <fileNamePattern>${LOG_FILE_PATH}/info-${BY_DATE}.%i.log</fileNamePattern>
                <maxFileSize>10MB</maxFileSize>
                <maxHistory>30</maxHistory>
            </rollingPolicy>
        </appender>

        <root level="info">
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>

</configuration>

Logback 출력 로그 색상 변경

<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<!-- %clr(...){cyan} 과 같이 사용할 수 있다. %clr() 내부의 내용이 지정한 색상으로 출력된다. -->

<!-- 사용 예 -->
<property name="LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}: %-5line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

참고 사이트 : https://oingdaddy.tistory.com/257

[Spring] Logback 설정

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.