Skip to content

Logging

Jaehun Choi edited this page Sep 30, 2022 · 1 revision

Logging

1. Level

로그에는 5 level이 존재한다.

trace, debug, info, warn, error

예를들어 Logging level이 info일 경우 info, warn, error가 로그에 남는다.

우리팀에서는 기본적으로 아래와 같이 로깅을 적용합니다.

  1. 예상치 못한 예외 ERROR
  2. 도메인에서 발생하는 인지할 수 있는 에러 WARN
  3. request, response, 운영에서 유의미한 일반 로그 INFO
  4. 운영상 필요하지는 않지만 dev 환경에서 점검해볼 수 있는 내용 DEBUG

2. 로깅의 형태

두 가지 형태로 로그를 작성할 수 있습니다.

//1. X
log.debug("name = " + huni);

//2. O
log.debug("name = {}", huni);

1번과 2번은 똑같은 로그를 생성하지만, 1번 로그는 로깅이 되든, 되지 않든 문자열을 연산하고 huni객체를 toString으로 만듭니다. 2번은 그렇지 않습니다. 따라서 MessageFormat을 사용하는 형태로 작성해야 합니다.

3. 땡쿠팀의 로깅 전략

property

logback관련 xml어디서든 사용할 수 있는 property입니다.

  • LOG_PATTERN
pattern = %-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%M:%line] - %msg%n
ex = INFO  22-09-23 00:08:09[http-nio-8080-exec-4] [LoggingAspect:responseLog:47] - [message]
  • LOG_PATH
저장경로 prefix = /home/ubuntu/logs

file-*-logger.xml

xml 파일을 Logback에서 읽어와 Logback 설정 클래스에 로딩합니다.

<included>
    <!--1-->
    <appender name="file-info-logger" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--2-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>[level]</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <file>${LOG_PATH}/info.log</file>
        <!--3-->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <charset>utf-8</charset>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
        <!--4-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/%d{yyyy-MM-dd}/info/info-%i.gz</fileNamePattern>
            <maxFileSize>50MB</maxFileSize>
            <maxHistory>7</maxHistory>
        </rollingPolicy>
    </appender>
</included>
  1. RollingFileAppender는 로깅 이벤트를 작성하는 Appender의 하위 클래스로, File로 저장하면서 특정 policy로 여러 파일 rolling하며 로그를 작성합니다.
  2. Level로 filter를 걸어줍니다. 해당 level 이상의 로그만 로깅합니다.
  3. 로그 패턴을 지정합니다.
  4. size와 시간으로 rolling 합니다. 최초에 생성된 로그 파일은 3번 위의 file 이름을 따르며, 그 이후에 롤링된 내용은 %i에 index가 생성되며 순차적으로 올라갑니다. (이 때, 새롭게 파일이 추가되면 기존 파일의 제목이 +1 되는 형식)

access log

스프링 부트에서는 텀캣의 request, response를 로깅해줍니다 (body 제외)

implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'

logback-access 파일을 생성하면 되고 로깅 전략은 아래와 같습니다.

%n###### HTTP Request ###### %n%fullRequest###### HTTP Response ###### %n%fullResponse

logback-spring.xml

spring 실행 환경별로 로그 전략을 구분할 수 있습니다.

<springProfile name="dev"/>

이 파일을 통해 여러 로깅 전략을 작성한 xml을 import 하여 사용할 수 있습니다. xml에서는 이를 include라고 사용합니다.

<include resource="logback/file-sql-slow-info-logger.xml"/>
        <logger name="com.woowacourse.thankoo" level="DEBUG">
            <appender-ref ref="file-debug-logger"/>
            <appender-ref ref="file-info-logger"/>
            <appender-ref ref="file-warn-logger"/>
            <appender-ref ref="file-error-logger"/>
        </logger>

이 때, 로그 설정 파일에 지정된 이름으로 appender-ref 를 호출하여 사용합니다.