Development/Spring

[Spring] slf4j를 이용한 spring logging

hyelie 2022. 10. 5. 10:33

로그의 목적은 아래 2가지 정도가 있다.

- 서비스 동작 상태 파악

- 장애 파악 및 알림

 

logging은 slf4j 등 로그 라이브러리를 사용할 것이다.

 

로그 레벨

- fatal : 어플리케이션 종료까지 만드는 error.

- error : 의도하지 않은 오류 발생, 종료는 안 됨.

- warn

- info : 서비스 동작 상태

- debug : 개발자가 보기 위한 것

- trace

 

인데, '의도하지 않은 에러'를 나타내는(ex. database connection error) error, 기록을 남기기 위한 info 2개를 사용하면 될 것 같다. 또 로그는 파일로 작성할 거고, 너무 많이 쌓이면 다른 것으로 빼 주어야 한다.

 

https://victorydntmd.tistory.com/173?category=698080

 

위 블로그에서 가져왔다.

 

일단 의존성 추가해 준다.

 

build.gradle

implementation 'org.slf4j:slf4j-api'
implementation 'ch.qos.logback:logback-classic'

 

다음으로 resources에 log를 어떻게 쓸지에 대한 data를 넣어야 한다.

 

main/resources/logback.xml

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

<configuration>
         <!-- 콘솔로 로그를 남김 -->
         <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
                  <encoder>
                           <charset>UTF-8</charset>
                           <!-- 로그 메시지 패턴 -->
                           <Pattern>
                                   %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
                           </Pattern>
                  </encoder>
         </appender>

         <!-- 파일로 로그를 남김 -->
         <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
                  <file>.\Logs\data.log</file>
                  <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                           <Pattern>
                                   %d{HH:mm:ss.SSS} [%thread] %-5level %logger{5} - %msg%n
                           </Pattern>
                  </encoder>

                  <!-- 로그를 남기는 파일의 용량이 10KB가 넘으면 이를 압축 파일로 만들고 새로 로그 파일로 만들라는 정책 -->
                  <triggeringPolicy
                           class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
                           <MaxFileSize>10KB</MaxFileSize>
                  </triggeringPolicy>

                  <!-- 파일을 덮어쓰는 정책 -->
                  <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
                           <FileNamePattern>.\Logs\data.%i.log.zip</FileNamePattern>
                           <!--
                               MinIndex가 1이고, MaxIndex가 10이므로, 위의 파일 이름 패턴에 따라 아래의 로그 파일이 생길 것이다.
                               logexample2.1.log.zip   logexample2.2.log.zip  .... logexample2.10.log.zip
                               이 상태에서 또 10KB가 넘으면 logexample2.1.log.zip이 된다.
                           -->
                           <MinIndex>1</MinIndex>
                           <MaxIndex>10</MaxIndex>
                  </rollingPolicy>
         </appender>

         <!--
                  com.bizkicks.backend 아래 패키지 로그들만  consoleAppender, fileAppender 방법으로 로그를 남긴다.         
                  info 이상의 레벨의 log만 남긴다.
         -->
         <logger name="com.bizkicks.backend"  level="info" additivity="false">
            <appender-ref ref="fileAppender" />
         </logger>

         <!-- root는 글로벌 로거를 의미하며, 위의 logger에 해당하지 않으면 root 로거가 실행된다. -->
         <root level="warn">
                  <appender-ref ref="consoleAppender" />
         </root>
</configuration>

 

이후 slf4j annotation을 붙이고 log.info 또는 log.error를 사용하면 된다.

@Slf4j
public class MyClass{
  public void MyFunction(){
    ...
    log.info("info log");
    log.error("error log");
    ...
  }
}