ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Logback이란? feat.SLF4J
    Spring Boot 2022. 1. 30. 18:51

    Logback이란? feat.SLF4J


     

    Logback?


    logback은 SLF4J의 구현체입니다. logback-core, logback-classic 및 logback-access의 세 가지 모듈로 구분됩니다.

     

    Logger, Appenders and Layouts


    Logger클래스는 logback-classic 모듈의 일부입니다 . 반면에 Appender및 Layout인터페이스는 logback-core의 일부입니다. 범용 모듈로서 logback-core에는 로거 개념이 없습니다.

     

    ▶Logger

    Logger는 가능한 모든 로그 기록을 개발자가 선택한 일부 기준에 따라 분류된다고 가정합니다.

    level of 
    request p
    effective level q
      TRACE DEBUG INFO WARN ERROR OFF
    TRACE YES NO NO NO NO NO
    DEBUG YES YES NO NO NO NO
    INFO YES YES YES NO NO NO
    WARN YES YES YES YES NO NO
    ERROR YES YES YES YES YES NO

     

    Appender

    Logback은 로깅 이벤트를 작성하는 작업을 Appender 컴포넌트에 에 위임합니다. Appender는 ch.qos.logback.core.Appender 인터페이스를 구현했습니다.

    ConsoleAppender, FileAppender, RollingFileAppender  3가지 대표적인 Appender를 제공합니다.

    (참고로 SMTPAppender 와 같이 메일을 발송하는 Appender도 있습니다.)

     

    ConsoleAppender

    이름처럼 콘솔에 추가하거나 더 정확하게는 System.out 또는 System.err 를 이용하여 콘솔에 출력합니다.

    Property Name Type Description
    encoder Encoder 이벤트가 기본 에 기록되는 방식을 결정합니다. 보통 패턴을 사용합니다.
    target String 문자열을 System.out, System.err로 출력합니다. 설정하지 않으면 default로 System.out으로 출력합니다.
    withJansi boolean default로 withJansi property를false로 설정합니다. withJansi 가 true 일 경우 NSI color code들을 윈도우 기계(?) 에게 제공합니다
    <configuration>
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
        </encoder>
      </appender>
    
      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>

     

    FileAppender

    로그 이벤트를 파일에 저장합니다. 대상 파일은 파일 옵션으로 지정됩니다. 파일이 이미 존재하는 경우 추가 속성 값에 따라 파일이 추가되거나 잘립니다 .

    Property Name Type Description
    append boolean 기존 파일에 로그를 이어서 기록하는 프로퍼티로 default는 true로 설정 되어있습니다. false이면 기존 파일이 잘립니다. 
    encoder Encoder 이벤트가 기본 에 기록되는 방식을 결정합니다. 보통 패턴을 사용합니다.
    file String 파일의 이름입니다. 파일이 없으면 파일을 생성합니다. 이때 파일의 경로 또한 설정해야 합니다. default 값은 없습니다.
    ex) ./log/error/error-${BY_DATE}.log
    prudent boolean default 값은 false 입니다. prudent 모드에서는 다른 서버에서 실행 중인 FileAppender가 있는 경우에도 지정된 파일에 안전하게 로그 이벤트를 기록합니다.
    <configuration>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>testFile.log</file>
        <append>true</append>
        <!-- set immediateFlush to false for much higher logging throughput -->
        <immediateFlush>true</immediateFlush>
        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>
            
      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root>
    </configuration>

     

     

    RollingFileAppender

    FileAppender에서 로그 파일을 '롤오버'하는 기능으로 확장 됩니다. 롤오버를 쉽게 설명하면 특정 조건을 달성하면 파일을 이동시키는 것이다. 

     예를 들어, 용량이 2GB에 도달하거나, 로그 기록이 일주일이 되는 등 특정 조건이 충족되면 기록 대상을 다른 파일로 변경할 수 있습니다.

    Property
    Name 
    Type Description
    append
    boolean 기존 파일에 로그를 이어서 기록하는 프로퍼티로 default는 true로 설정 되어있습니다. false이면 기존 파일이 잘립니다. 
    encoder Encoder 이벤트가 기본 에 기록되는 방식을 결정합니다. 보통 패턴을 사용합니다.
    file String 이벤트가 기본 에 기록되는 방식을 결정합니다. 보통 패턴을 사용합니다.
    rolling
    Policy
    Rolling
    Policy
    롤오버가 발생할 때의 동작을 지시하는 구성 요소입니다. 3가지 정책을 제공합니다.
    - TimeBasedRollingPolicy
    - Size and time based rolling policy
    - FixedWindowRollingPolicy
    triggering
    Policy
    TriggeringPolicy 롤오버를 활성화할 시기를 알려주는 요소입니다. SizeBasedTriggeringPolicy 정책 한 가지로 현재 활성 파일의 크기를 확인하여 롤오버를 트리거 합니다. maxFileSize 옵션만 가지고 있습니다.
    prudent boolean  

    rolling Policy

    • TimeBasedRollingPolicy - 가장 인기 있는 정책입니다. 일별 또는 월별과 같이 시간을 기준으로 롤오버 합니다.
      • <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- keep 30 days' worth of history capped at 3GB total size -->
            <maxHistory>30</maxHistory>
            <totalSizeCap>3GB</totalSizeCap>
        </rollingPolicy>
    • Size and time based rolling policy - 파일 크기와 날짜 기반으로 동작합니다.
      • <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
            <!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
            <maxFileSize>100MB</maxFileSize>    
            <maxHistory>60</maxHistory>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    • FixedWindowRollingPolicy -  fixed window 알고리즘으로 동작합니다. 특정 인덱스를 넘기면 롤오버합니다.
      • <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>tests.%i.log.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>

     

    triggering Policy

    • SizeBasedTriggeringPolicy - 특정 파일 사이즈를 넘어가면 롤오버하도록 트리거 합니다.
      • <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
            <maxFileSize>5MB</maxFileSize> 
        </triggeringPolicy>

     

    Encoder

    인코더는 이벤트를 바이트 배열로 변환하고 해당 바이트 배열을 OutputStream으로 변환합니다. 

    <encoder>
      <pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
      <outputPatternAsHeader>true</outputPatternAsHeader>
    </encoder>

     

    Layout

    0.9.19 이전의 logback은 대부분의 Appender는 Layout에 의존하여 이벤트를 문자열로 변환하였으나 0.9.19부터 FileAppender하위 클래스는 더 이상 레이아웃을 사용하지 않습니다.

     

    Filter

    Filter는 삼항 논리를 기반으로 하여 조합되거나 연결되어 임의로 복잡한 필터링 정책을 구성할 수 있습니다.

    필터 정보는 공식 문서에서 확인 할 수 있습니다.

    Filter Name TYPE
    event LoggingEvent
    message String
    formattedMessage String
    logger String
    loggerContext LoggerContextVO
    level int
    timeStamp long
    marker Marker
    mdc
    Map

     

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

     

     

    Spring Boot 적용하기


    로깅 프레임워크인 logback-classic 모듈은 logback-classic.jar 외에도 logback-core.jar 가 필요합니다.

    spring-boot-starter를 implementation 사용하고 있다면 특별한 설정 없이 사용이 가능합니다.

     

     

     

    src/main/recources 경로에 logback 설정 파일인 logback-spring.xml 파일을 생성합니다.

    logback-spring.xml의 예시 입니다. 검프의 Logging(로깅) #2 영상을 참고하여 작성하였습니다.

    <?xml version="1.0" encoding="UTF-8"?>
    
    <configuration>
        <timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
        <property name="LOG_PATTERN"
                  value="[%d{yyyy-MM-dd HH:mm:ss}:%-4relative] %green([%thread]) %highlight(%-5level) %boldWhite([%C.%M:%yellow(%L)]) - %msg%n"/>
    
        <springProfile name="prod">
            <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>./log/info/info-${BY_DATE}.log</file>
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>INFO</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
                <encoder>
                    <pattern>${LOG_PATTERN}</pattern>
                </encoder>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <fileNamePattern>./backup/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <maxFileSize>100MB</maxFileSize>
                    <maxHistory>30</maxHistory>
                    <totalSizeCap>3GB</totalSizeCap>
                </rollingPolicy>
            </appender>
    
            <appender name="FILE-WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>./log/warn/warn-${BY_DATE}.log</file>
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>WARN</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
                <encoder>
                    <pattern>${LOG_PATTERN}</pattern>
                </encoder>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <fileNamePattern>./backup/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <maxFileSize>100MB</maxFileSize>
                    <maxHistory>30</maxHistory>
                    <totalSizeCap>3GB</totalSizeCap>
                </rollingPolicy>
            </appender>
    
            <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <file>./log/error/error-${BY_DATE}.log</file>
                <filter class="ch.qos.logback.classic.filter.LevelFilter">
                    <level>ERROR</level>
                    <onMatch>ACCEPT</onMatch>
                    <onMismatch>DENY</onMismatch>
                </filter>
                <encoder>
                    <pattern>${LOG_PATTERN}</pattern>
                </encoder>
                <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                    <fileNamePattern>./backup/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
                    <maxFileSize>100MB</maxFileSize>
                    <maxHistory>30</maxHistory>
                    <totalSizeCap>3GB</totalSizeCap>
                </rollingPolicy>
            </appender>
    
            <root level="INFO">
                <appender-ref ref="FILE-INFO"/>
                <appender-ref ref="FILE-WARN"/>
                <appender-ref ref="FILE-ERROR"/>
            </root>
        </springProfile>
    </configuration>

     

     

     

    Post


    References


     

     


    잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)

     

    댓글