우리 팀의 로깅 전략 - woowacourse-teams/2021-gpu-is-mine GitHub Wiki

우리 팀의 로깅 전략

  1. HTTP 요청, 응답 -> Console
  2. Info 레벨 이상의 정보, DB access 정보 -> logs/log.log
  3. 서버 에러 정보 -> logs/err_log.log

로깅 설정 방법

logback 설정 파일

logback 설정 파일로 로그를 출력하는 위치, 출력할 로그 레벨, 출력 패턴을 지정한다. 스프링 부트의 기본 logback 설정 파일 위치는 'resource/logback-spring.xml' 이다.


logback 설정 파일의 Appender

발생한 로깅을 지정한 출력 레벨, 패턴, 위치에 따라 출력한다. 프로젝트에서 사용한 Appender 구현체는 ConsoleAppender, RollingFileAppender 두 가지인데, 각각 Console과 File에 출력한다.


ex,ConsoleAppender 예시

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>%-5level %d{yy-MM-dd HH:mm:ss} [%logger{0}:%line] - %msg%n</pattern>
    </encoder>
</appender>

<!-- 출력 예시 : INFO  21-07-08 20:47:52 [DocumentationPluginsBootstrapper:160] - Context refreshed -->

ex, RollingFileAppender 예시

<appender name="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>
    <file>logs/error.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>${LOG_PATTERN}</pattern>
    </encoder> 

    <!-- Rolling 정책 -->

    <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
        <fileNamePattern>logs/error.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- 파일당 최고 용량 kb, mb, gb -->
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy> <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
        <maxHistory>60</maxHistory>
    </rollingPolicy>
</appender>

logging 레벨과 출력 정도

로깅의 정도를 설정하고, Application에서 받은 로그 중 Appender가 어떤 레벨까지 처리할 것인지를 정한다.


예를 들면 아래 예시에서 logging 레벨을 info로 하는 경우, info, error 모두 로깅되고, logging 레벨을 error로 하는 경우 error만 로깅된다.

public class TestApplication {
    static final Logger logger = LoggerFactory.getLogger(TestApplication.class);

    public void test() {
        logger.error("error");
        logger.info("info"); 
    }

   // 레벨 순서 : TRACE  <  DEBUG  <  INFO  <  WARN  <  ERROR
}

ex, Logging level 지정 예시 (application.properties)

logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.root=error

ex, Logger level 지정 예시 (logback-spring.xml)

<!-- ERROR Level 이상의 로깅 정보를 CONSOLE 이라는 이름을 가진 Appender로 처리한다. -->
<root level="ERROR">
    <appender-ref ref="CONSOLE"/>
</root> 

단, logback 설정 파일에서 지정한 로깅 레벨보다, application 설정 파일로 지정한 레벨이 우선 순위가 높은 것으로 생각된다.


참고 자료

https://bcho.tistory.com/759

⚠️ **GitHub.com Fallback** ⚠️