본문 바로가기
스프링/스프링부트

[Spring Boot] logback을 통해 스프링부트 로그 설정 시작하기

by 책 읽는 개발자_테드 2021. 4. 4.
반응형

logback을 통해 스프링부트 로그 설정 시작하기

 

스프링부트 로그 설정을 하기 전에 관련 지식을 간단히 알아보자.

 

스프링 부트는 SLF4J(Simple Logging Facade for Java)를 이용하여 로그를 관리한다. 이는 로깅 프레임워크를 쉽게 사용할 수 있도록 도와주는 퍼사드다.

  • 퍼사드는 GoF 디자인 패턴 중 하나로서 복잡한 서브 시스템을 쉽게 사용할 수 있도록 간단하고 통일된 인터페이스를 제공한다. 

스프링 부트는 퍼사드를 이용하여 로깅 프레임워크의 구조를 몰라도 쉽게 사용할 수 있고, 프레임워크와의 의존성을 낮게 유지하여 쉽게 교체할 수 있도록 한다.

 

스프링 부트는 SLF4J라는 퍼사드를 통해서 LogBack을 사용한다. LogBack은 Log4j 개발자인 세키 굴쿠(Ceki Gulku)가 기존에 널리 사용되던 Log4j를 대체하기 위해 성능과 여러 장점을 추가한  로깅 프레임워크다. 

 

LogBack vs Log4j 벤치마크 결과 

https://www.loggly.com/blog/benchmarking-java-logging-frameworks/


이제 본격적으로 스프링부트로 로그 설정을 시작해보자.

 

학습 목표

- 스프링 부트 로깅 시작하기

- Logging 관련 Spring Boot Properties

- 로그 설정 직접 관리하기


스프링 부트 로깅 시작하기

 

스프링 부트 프로젝트를 생성하고, 의존관계를 확인해보면 logging 스타터를 이용하여 기본적으로Logback과 Log4j를 SLF4J 구현체로 가지고 있는 걸 확인할 수 있다.

 

로그는 레벨이 존재하고, 레벨에 따라 우선순위가 다르다.

 

Level   Color   의미  
1.ERROR RED 사용자 요청을 처리하는 중 문제
2.WARN YELLOW 처리 가능한 문제지만, 향후 시스템 에러의 원인이 될 수 있는 문제
3.INFO GREEN 로그인이나 상태 변경과 같은 정보성 메시지
4.DEBUG GREEN 개발시 디버깅 목적으로 출력하는 메시지
5.TRACE GREEN DEBUG 레벨 보다 좀더 상세한 메시지



 특정 로그 레벨을 지정하면 해당 로그 레벨의 상위 우선순위 로그가 모두 출력된다. 예를 들어 INFO로 지정하면 DEBUG를 시작으로 INFO, WARN, ERROR 메시지가 모두 출력된다. 

 

이제 애플리케이션에서 로그를 출력해보자. 스프링부트 프로젝트에 아래와 같이 다양한 레벨의 로그를 출력하는 LogginRunner 클래스를 작성한다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Service;

@Service
public class LoggingRunner implements ApplicationRunner {

   private Logger logger = LoggerFactory.getLogger(LoggingRunner.class);

   @Override
   public void run(ApplicationArguments args) throws Exception {

       logger.trace("TRACE 로그 메시지");
       logger.debug("DEBUG 로그 메시지");
       logger.info("INFO 로그 메시지");
       logger.warn("WARN 로그 메시지");
       logger.error("ERROR 로그 메시지");

   }
}

 

스프링부트 프로젝트를 실행하면 아래와 같은 로그가 출력된다.

 

 

스프링 부트는 별도의 설정이 없으면 로그 레벨을 INFO로 처리한다. 따라서 INFO 이상의 로그 메시지만 콘솔에 출력된 것이다. 

 

Logging 관련 Spring Boot Properties

로그 레벨 조정

로그 레벨을 조정하고 싶으면 외부 프로퍼티 파일(application.properties)을 수정해야 한다. 

 

src/main/resources/application.properties

#Loggin Setting
logging.level.com.deeping = trace

 

위에서 처럼 프로퍼티 이름을 ‘logging-level-패키지’로 설정하면, 해당 패키지로 시작하는 로그 메시지들의 레벨을 설정할 수 있다. 다시 스프링 부트 프로젝트를 실행하면, 설정한 레벨(trace) 이상의 로그 메시지가 콘솔에 출력된다.

 

로그 파일 생성 

로그 메시지를 파일에 출력하려면 application.ppoperties 파일에 로그 파일 이름과 위치를 추가한다.

 

#Loggin Setting
logging.level.com.deeping = trace
logging.file.name=C:/Users/tlatm/Desktop/log/customer.log



스프링부트 프로젝트를 다시 실행하면,  선택한 경로에 로그 파일이 생성된다.

 

 

* 주의. 기존에는 아래와 같은 방식으로 로그 파일 경로를 설정했는데, 해당 방식은 스프링 2.2 부터 deprecated되었다. 해당 방식을 사용하면 로그 파일을 생성할 수 없다.

logging.file = 경로  (deprecated)

 

이외에도 아래와 같은 설정들이 존재한다.

key    설명   
logging.file.name 절대 경로로 표현되거나 현재 경로의 상대 경로로 로그 파일명을 지정한다.
logging.file.path logging.file의 값이 없을 때 동작한다. 지정된 경로에 spring.log로 로그를 남긴다.
logging.file.max-size 로그 파일의 사이즈가 지정된 임계치를 초과하면 파일명에 index를 추가한 후 새로운 파일을 작성한다.
예 : spring1.log, spring2.log
logging.file.max-history 아래에서 따로 설명한다.
logging.level.* path 기반으로 logger의 level을 지정한다.

 

로그 설정 직접 관리하기

스프링 부트가 제공하는 기본 로그 설정을 사용하지 않고 직접 관리하고 싶다면 logback.xml 파일을 추가한다. 

 

기존에 application.yml에 있던 로깅설정을 지우고,  /src/main/resource 소스 폴더에 logback.xml 파일을 작성한다.



logback.xml

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

<configuration>
  <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
     <!--  <file>C:/Users/tlatm/Desktop/log/deeping-customer.log</file> --> 
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
          <fileNamePattern>
              C:/Users/tlatm/Desktop/log/deeping-customer.%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>
       <encoder>
           <pattern>
               %d{yyyy:MM:dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n
           </pattern>
       </encoder>
   </appender>

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
          <encoder>
              <pattern>
                   %d{yyyy:MM:dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{35} : %msg %n
              </pattern>
          </encoder>
    </appender>

      <logger name="com.deenping" level="INFO" additibity="false">
       <appender-ref ref="consoleAppender"/>
       <appender-ref ref="fileAppender"/>
      </logger>

      <root level="INFO">
          <appender-ref ref="fileAppender"/>
          <appender-ref ref="consoleAppender"/>
      </root>
</configuration>

 

로그백 설정은 크게 appender와 logger로 구성된다.

 

appender

appender는 어디에 어떤 패턴으로 로그를 출력할 것인지 결정한다. 위 설정의 ‘fileAppender’는 RollingFileAppender 클래스를 이용해서 특정 파일에 로그를 출력한다. ‘consoleAppender’는 ConsoleAppender 클래스를 이용해서 콘솔에 로그를 출력한다.

 

<file>로 로그 파일의 위치와 이름을 지정할 수 있다. 위 설정은 C:/Users/tlatm/Desktop/log 디렉토리에 deeping-customer.log 파일을 생성하고, 로그 메시지를 출력하라는 설정이다.

 

<rollingPolicy>로 로깅 정책을 설정할 수 있다. TimeBasedRollingPolicy 클래스를 이용하면 일정한 시간을 기준으로 롤링되는 로그 파일을 생성할 수 있다. 

 

<maxHistory>는 롤링 파일이 만들어지는 시간이다. 30으로 설정하면 한 달 정도의 시간이 지난 후 기존의 로그 파일을 압축하고 새로운 로그파일을 생성하라는 의미다. 

 

이때 압축되는 로그 파일의 패턴을 <fileNamePattern>을 이용하여 지정할 수 있다. 이것을 사용하기 위해서는 위에서 로그 파일의 위치와 이름을 지정한 <file> 설정은 지우도록하자. 그렇지 않으면 로그파일이 중복으로 생성된다.<encoder>는 출력한 로그의 패턴을 지정하며, 로그 패턴 설정은 <pattern>을 사용한다. 

 

logger

logger를 이용하여 애플리케이션에서 사용할 로거를 등록한다.  위 설정에서는 com.deeping.customer라는 로거로 앞에서 설정한 두 개의 appender를 사용하여 콘솔과 파일에 로그를 출력한다. 이때, level 속성을 이용하여 특정 레벨 이상의 로그를 출력할 수 있다.

 

다음은 로그 메시지의 패턴을 지정할 때 사용하는 주요 변환 패턴과 의미다.

 

패턴    의미   
%d 시간(yyyy-MM-dd HH:mm:ss, SSS형태) 
%date{format} 원하는 형태로 시간 정보 출력
  예) %date{yyyy-MM-dd} 
%logger{length} Logger이름. {length}는 최대 자리수. Length에 따라 로거 이름이 축약됨.
%thread 현재 스레드 이름
%-5level 로그 레벨 
5는 출력 고정폭 값
%msg 로그 메시지 
%n 개행(new line) 처리

 

이제 스프링부트 프로젝트를 다시 시작하면, 콘솔에 com.deeping 패키지로 시작하는 INFO 이상의 로그가 출력되는 것을 확인할 수 있다.

 

 

또한 설정한 로그 파일도 생성되었다.

 

 

출처

스프링부트 퀵스타트

https://meetup.toast.com/posts/149

https://goddaehee.tistory.com/206

반응형

댓글