개발/Spring

[Spring] LogBack 설정

nova_dev 2020. 12. 31. 21:31
반응형

Spring 
LogBack 설정하기

이번 포스팅에서는 LogBack은 무엇인지, 그리고 어떤 설정을 할 수 있는지 자세하게 알아보려 합니다.

 Logback이란?

LogBack은 가장 많이 사용되고 있는 로깅 프레임워크 중 하나입니다. Logback은 이전에 많이 사용되고 있던 Log4j의 대안책으로 나온 slf4j와 그 구현체인데, slf4j는 패시드(Facade)패턴으로 구현체의 종류와 상관없이 일관된 로깅 코드를 작성할 수 있기 때문에 범용적입니다.

LogBack의 구성요소로는 Logger, Appender, Encoder 3가지가 있으며 다음과 같은 역할을 합니다.

  • Logger: 실제 로깅을 수행한다. Level 속성으로 출력할 로그의 레벨을 정한다.
  • Appender: 로그 메세지가 출력될 대상을 정한다.
  • Encoder: Appender에 포함되어 어떤 형식으로 로그 메시지를 표현할지 결정한다.

 LogBack 설정하기 (xml 방식)

1. LogBack Dependency를 설정한다. (gradle 기준)
Spring boot를 사용한다면 spring-boot-starter-web에 이미 포함되어 있기 때문에 dependency 설정은 넘어가도 무방합니다.

dependencies {
	...
    compile("ch.qos.logback:logback-classic:1.2.3")
	...
}

2. LogBack xml을 설정한다.

resources폴더 아래에 logback.xml을 만듭니다.

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

    <!-- 로그 레벨과 저장할 폴더 위치를 저장하고 있는 property 입니다. -->
    <property scope="context" name="LOG_LEVEL" value="INFO"/>
    <property scope="context" name="LOG_DIR" value="/var/log/"/>

    <!-- 콘솔에 로그를 남깁니다. -->
    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 파일에 로그를 남깁니다. -->
    <appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_DIR}/application.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%thread] [%-5level] %logger{36} - %msg%n
            </pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!-- 파일을 저장할 때 최대 30일간 1G의 로그만을 저장합니다. -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/application/log.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 에러 일 경우 파일에 로그를 남깁니다 -->
    <appender name="Error" 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>

        <file>${LOG_DIR}/error.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss} [%-5level] %logger{36} - %msg%n
            </Pattern>
            <charset>UTF-8</charset>
        </encoder>

        <!-- 파일을 저장할 때 최대 30일간 1G의 로그만을 저장합니다. -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_DIR}/application/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- com.test.application 패키지의 info레벨 로그를 Common, File, Error에 남깁니다. -->
    <logger name="com.test.application" level="INFO" additivity="false">
        <appender-ref ref="Console"/>
        <appender-ref ref="File"/>
        <appender-ref ref="Error"/>
    </logger>


</configuration>

 Encoder 형식

<encoder>
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>

(예시) 21:32:10.311 [main] DEBUG com.baeldung.logback.LogbackTests - Logging message: This is a String

  • % d {HH : mm : ss.SSS} – 시간, 분, 초 및 밀리 초가 포함 된 타임 스탬프
  • [% thread] – 로그 메시지를 생성하는 스레드 이름 (대괄호로 묶임)
  • % -5level – 5 자로 채워진 로깅 이벤트의 수준
  • % logger {36} – 35 자로 잘린 로거의 이름
  • % msg % n – 로그 메시지 뒤에 플랫폼 종속 줄 구분 문자가옵니다.

 RollingFileAppender 형식

<property name="LOG_FILE" value="LogFile" />
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_FILE}.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.gz</fileNamePattern>

        <!-- keep 30 days' worth of history capped at 3GB total size -->
        <maxHistory>30</maxHistory>
        <totalSizeCap>3GB</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
    </encoder>
</appender> 

RollingPolicy는 그냥 동일한 파일에 로그 메세지를 추가하는 것이 아니라, 시간이나 로그 파일의 크기 등을 조합하여 파일에 롤을 정하는 일을 합니다.

예시와 같이, maxHistory를 지정할 경우, 최대로 저장할 수 있는 날짜를 지정할 수 있고, totalSizeCap을 지정할 경우 최대로 저장할 수 있는 데이터의 크기를 지정할 수 있습니다.

 

관련글

1.Logback 사용법
www.baeldung.com/logback

 

 
 

 

 

반응형