ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Logback을 통한 Log 관리하기
    Backend/Springboot 2022. 10. 25. 13:12

    1. Logback 이란?

    - java.util.logging, log4j, log4j2등을 잇는 자바 로깅 프레임워크

    - spring boot에서는 기본 로깅 모듈로 채택

     

    1-1. slf4j (Simple Logging Facade For Java)

    - 자체적인 로킹 프레임워크가 아니고 logger 추상체로써 다른 로깅 프레임워크가 접근할 수 있도록 도와주는 추상화 계층

    - 즉, logback이나 log4j2와 같은 로킹 프레임워크의 인터페이스의 역할

    - slf4j2를 이용하면 코드를 일정하게 유지하면서 구현체의 전환을 통해 다른 로깅 프레임워크로이 손쉬움

     

     

    1-2. log4j vs logback vs log4j2

    Log4j Logback Log4j2
    가장 오래된 로깅 프레임워크
    2015년 이후 개발 중단
     log4j에 비해 향상된 필터링 정책 및 기능(ex. 로그인 한 경우 logging 등등)과 로그 레벨 변경등에 대해 서버 재시작 없는 자동 리로딩을 지원 가장 최신
    logback처럼 필터링 기능과 자동 리로딩을 지원
    SLF4J 지원X SLF4J 지원 SLF4J 지원
        Multi Thread 환경에서 비동기 로거(Async Logger)의 경우 다른 로깅 프레임워크보다 처리량이 훨씬 많고, 대기 시간이 훨씬 짧다. 
        Java8부터 도입된 람다식을 지원하고, Lazy Evalutaion

    이 중, logback은 Springboot 환경에서 spring-boot-starter-web안에 spring-boot-starter-logging의 logback이 기본적으로 포함되어 있어 별다른 dependency 추가 없이 사용할 수 있다.

     

    오늘은 logback을 통한 log 관리에 대해 알아보고자 한다.

     

    2. Logback을 통한 로그 관리하기

    로그를 통해 애플리케이션에서 일어나는 일들을 기록으로 남겨 실시간 혹은 과거에 일어났던 사건을 역으로 트래킹하기에 좋은 자료

    따라서, 적정한 로그 레벨로깅 위치를 결정하는 것이 매우 중요

     

    Logback 설정 파일로 다음과 같은 것들을 지정할 수 있음

     

    2-1. 로그의 형식 지정 (error, warn, info, debug, trace)

     

    Logback 은 5단계의 로그 레벨을 가진다.
    심각도 수준은 Error > Warn > Info > Debug > Trace 이다.

    ⛔️ Error : 예상하지 못한 심각한 문제가 발생하는 경우, 즉시 조취를 취해야 할 수준의 레벨
    ⚠ ️Warn : 로직 상 유효성 확인, 예상 가능한 문제로 인한 예외 처리, 당장 서비스 운영에는 영향이 없지만 주의해야 할 부분
    ✅ Info : 운영에 참고할만한 사항, 중요한 비즈니스 프로세스가 완료됨
    ⚙️ Debug : 개발 단계에서 사용하며, SQL 로깅을 할 수 있음
    📝 Trace : 모든 레벨에 대한 로깅이 추적되므로 개발 단계에서 사용함

     

    Debug 와 Trace 레벨은 많은 양의 로그가 쌓이므로 자칫 운영 단계에서 해당 레벨의 로깅을 할 경우 용량 감당이 안 될 수 있다.

    그렇기 때문에 중요하지 않은 정보는 Debug 이하로 설정하고 로깅을 하지 않는 편이 좋다.

     

    Debug, Trace 레벨의 로깅은 개발 단계에서만 사용하고 배포 단계에서는 권장하지 않는다고 한다.

    2-2. 일정 로그 레벨 이상의 로그들만 남기기

    콘솔 로그 수준을 변경하는 가장 간단한 방법 (ex. Debug 이상만 출력)

    // application.yml
    logging:
        level:
            root: debug

    // logback-spring.xml

    ex) debug 레벨은 모두 출력

        <logger name="org.springframework.web" level="debug">
            <appender-ref ref="FILE" />
        </logger>

     

     

    2-3. 로그를 콘솔에 출력만 할지, 파일로 남길지 결정

    2-3-1. 콘솔에 출력

    // logback-spring.xml

        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            </layout>
        </appender>

     

    2-3-2. 파일로 남기기

    // logback-spring.xml

        <!-- 파일(FILE) -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--     log 기록할 파일 위치 설정 -->
            <file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
            <!--     log 기록 타입 인코딩 -->
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
        </appender>

     

     

    2-4. 일정 시간이 지날 때마다 시간 별로 로그 파일을 정리하거나 용량에 따라 로그 파일을 압축해서 보관하기

        <!-- 파일(FILE) -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--     log 기록할 파일 위치 설정 -->
            <file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
            <!--     log 기록 타입 인코딩 -->
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- daily rollover -->
                <fileNamePattern>logs/dailyLogFiles/%d{yyyy-MM-dd}.log</fileNamePattern>
                <!-- keep 30 days' worth of history capped at 3GB total size -->
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    • fileNamePattern: 아카이브 될 로그 파일의 패턴을 정의한다. %d 문자를 이용해 파일의 적절한 부분을 dateTime 패턴으로 바꿔준다. default(%d)는 yyyy-mm-dd로 매일 자정 새로운 로그 파일로 rollover 한다.
    • maxHistory: 아카이브에 저장할 로그 파일 개수를 지정한다. fileNamePattern에 명시된 dateTime 패턴의 최소 단위에 따라 rollover 단위가 달라진다. 
    • totalSizeCap: 로그 파일 아카이브 저장소 최대 크기를 지정한다. 이를 초과하면 가장 오래된 파일이 삭제된다.

     

     

    2-5. Spring Profile 별로 로그 설정 다르게 가져가기

    // logback-spring.xml

        <springProfile name="local">
            <root level="info">
                <!--     참조할 appender - STDOUT -->
                <appender-ref ref="STDOUT" />
            </root>
        </springProfile>
        <!--  dev 환경  -->
        <springProfile name="dev">
            <root level="debug">
                <!--     참조할 appender - STDOUT -->
                <appender-ref ref="STDOUT" />
            </root>
            <logger name="org.springframework.web" level="debug">
                <!--     참조할 appender - FILE -->
                <appender-ref ref="FILE" />
            </logger>
        </springProfile>

     

     

    3. Logback 기본 설정 방법

    'src/main/resources/' 밑에 logback-spring-xml 파일을 생성

     

    최종적인 logback-spring.xml의 예시

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <include resource="org/springframework/boot/logging/logback/defaults.xml" />
        <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
    
        <!-- log 기록 절대 위치 설정 -->
        <property name="LOGS_ABSOLUTE_PATH" value="./logs" />
    
        <property name="CONSOLE_LOG_PATTERN"
                  value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative]  %clr(%-5level) %clr(${PID:-}){magenta} %clr(---){faint} %clr([%15.15thread]){faint} %clr(%-40.40logger{36}){cyan} %clr(:){faint} %msg%n"/>
        <property name="FILE_LOG_PATTERN"
                  value="[%d{yyyy-MM-dd HH:mm:ss}:%-3relative] %-5level ${PID:-} --- [%15.15thread] %-40.40logger{36} : %msg%n"/>
    
        <!-- 콘솔(STDOUT) -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <layout class="ch.qos.logback.classic.PatternLayout">
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            </layout>
        </appender>
    
        <!-- 파일(FILE) -->
        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <!--     log 기록할 파일 위치 설정 -->
            <file>${LOGS_ABSOLUTE_PATH}/logback.log</file>
            <!--     log 기록 타입 인코딩 -->
            <encoder>
                <pattern>${FILE_LOG_PATTERN}</pattern>
            </encoder>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <!-- daily rollover -->
                <fileNamePattern>logs/dailyLogFiles/%d{yyyy-MM-dd}.log</fileNamePattern>
                <!-- keep 30 days' worth of history capped at 3GB total size -->
                <maxHistory>30</maxHistory>
                <totalSizeCap>3GB</totalSizeCap>
            </rollingPolicy>
        </appender>
    
        <!-- log 레벨 설정 (logging.level.root=info)-->
        <root level="info">
            <!--     참조할 appender 설정 - STDOUT -->
            <appender-ref ref="STDOUT" />
        </root>
    
        <!-- log 레벨 설정 (org.springframework.web=debug)-->
        <logger name="org.springframework.web" level="debug">
            <appender-ref ref="FILE" />
        </logger>
    
    </configuration>
Designed by Tistory.