back end/log4j

[스프링부트] Spring Boot 로그 설정 - Logback

노루아부지 2020. 10. 25. 23:37

Logback이란?

  • Java에서 Log 기록을 위한 Open-Source framework.  SLF4J의 구현체입니다.
  • Spring Boot에서는 default로 설정되어 있어서 사용 시 별도로 라이브러리를 추가하지 않아도 됩니다.
  • spring-boot-start-web 안에 spring-boot-starter-logging에 구현체가 있습니다.
  • Logback을 이용하여 logging 하기 위해서 필요한 주요 설정 요소로는 Logger,  Appender, Encoder의 3가지가 있습니다.

 

 

Spring Boot  logback 설정파일

 

Spring이나 일반 java 프로그램의 경우 logback.xml 파일을 resources 디렉터리에 만들어서 참조하지만 Spring Boot의 경우에는 아래 3가지 중 한 가지 방법을 선택합니다.

  • application.properties에 설정
  • resources/logback-spring.xml에 설정
  • resources/logback.xml에 설정

 

Log level 순서 및 사용 방법

 

TRACE  < DEBUG < INFO < WARN < ERROR

 

  • ERROR: 요청을 처리하는 중 오류가 발생한 경우 표시
  • WARN: 처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 표시
  • INFO:  상태 변경과 같은 정보성 로그를 표시
  • DEBUG: 프로그램을 디버깅하기 위한 정보를 표시
  • TRACE: 추적 레벨은 DEBUG보다 훨씬 상세한 정보를 표시

위의 순서대로 높은 레벨을 가집니다. 출력  레벨의 설정에 따라 설정 레벨 이상의 로그를 표시합니다. 예를 들어 LEVEL을 INFO로 하였을 경우 INFO, WARN, ERROR LEVEL을 표시합니다.

 

 

 

Logger 등록 및 사용방법

 

1. application.properties 파일에 설정

Spring Boot에서는 간단하게 application.properties 파일에 설정할 수 있습니다.

설정은 아래와 같습니다.

# root level(전체) 로깅 레벨 지정
logging.level.root=info

# 패키지 별로 로깅 레벨 지정
# logging.level 이후 로깅 레벨을 설정할 패키지를 설정합니다.
# (com.text=info)
# 아래와 같이 상위 패키지의 레벨을 설정하고,
# 하위 패키지들에 대한 각각의 로깅 레벨을 별도로 설정할 수 있습니다.
logging.level.com.test=info
logging.level.com.test.controller=debug

# log 파일 경로/이름 지정
logging.file=c:/logs/my.log

# c:/logs/spring.log 파일 생성
logging.path=c:/logs/

# ansi 터미널을 지원한다면 console에 색상 추가 가능
# inellij는 기본으로 되어있음. eclipse는 플러그인 설치 필요
spring.output.ansi.enabled=always

# logback.xml을 사용하고, 그 위치를 변경하고 싶을 경우
logging.config=classpath:logback/logback.xml

 

제약사항

  • 일자별 rolling 불가능
  • logging.path + logging.file로 로그 파일이 생성되지 않음

 

 

 

2. logback-spring.xml 설정

기본 특징

  • 대소문자를 구분하지 않음
  • name attribute를 반드시 지정해야 함
  • Logback-spring.xml은 크게 두 개로 구분(appender와 logger)
  • Dynamic Reloading 기능을 지원

 

[참고] logback.properties 설정

spring boot에서는 간단하게 application.properties에서도 log 설정을 할 수 있지만 상세한 설정을 위해서는 logback-spring.xml에 설정을 따로 해야 합니다.

그런데, xml은 복잡하기 때문에 파일 경로나 파일명 등은 수정하기 쉽도록 별도로 properties 파일로 분리하기도 합니다.

  log.config.path=c:/logs/
  log.config.filename=text.log

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!-- 60초마다 설정 파일의 변경을 확인 하여 변경시 갱신 -->
<configuration scan="true" scanPeriod="60 seconds">
  
  <property resource="logback.properties"/>
    
  <!--Environment 내의 프로퍼티들을 개별적으로 설정할 수도 있다.-->
  <springProperty scope="context" name="LOG_LEVEL" source="logging.level.root"/>
  <!-- log file path -->
  <property name="LOG_PATH" value="${log.config.path}"/>
  <!-- log file name -->
  <property name="LOG_FILE_NAME" value="${log.config.filename}"/>
  <!-- err log file name -->
  <property name="ERR_LOG_FILE_NAME" value="err_log"/>
  <!-- pattern -->
  <property name="LOG_PATTERN" value="%-5level %d{yy-MM-dd HH:mm:ss}[%thread] [%logger{0}:%line] - %msg%n"/>
  
  
  <!-- Console Appender -->
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <pattern>${LOG_PATTERN}</pattern>
    </encoder>
  </appender>
      
  <!-- File Appender -->
  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 파일경로 설정 -->
    <file>${LOG_PATH}/${LOG_FILE_NAME}.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>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- 파일당 최고 용량 kb, mb, gb -->
        <maxFileSize>10MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- 일자별 로그파일 최대 보관주기(~일), 해당 설정일 이상된 파일은 자동으로 제거-->
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>
  <!-- 에러의 경우 파일에 로그 처리 -->
  <appender name="Error" 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>${LOG_PATH}/${ERR_LOG_FILE_NAME}.log</file>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
      <!-- 이 옵션이 없을 경우 한글이 깨지는 경우 있음-->
      <charset>UTF-8</charset>
      <pattern>${LOG_PATTERN}</pattern>
    </encoder>
    <!-- Rolling 정책 -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- .gz,.zip 등을 넣으면 자동 일자별 로그파일 압축 -->
      <fileNamePattern>${LOG_PATH}/${ERR_LOG_FILE_NAME}.%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>
  <!-- root레벨 설정 -->
  <root level="${LOG_LEVEL}">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    <appender-ref ref="Error"/>
  </root>
  <!-- 특정패키지 로깅레벨 설정 -->
  <logger name="org.apache.ibatis" level="DEBUG" additivity="false">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
    <appender-ref ref="Error"/>
  </logger>
</configuration>

 

 

 

2.1) appender

  • log의 형태를 설정
  • log 메시지가 출력될 대상(console/file)을 결정하는 요소

2.1.1) appender의 class 종류

  • ch.qos.logback.core.ConsoleAppender
    • 콘솔에 로그 기록. 로그를 OutputStream에 작성하여 콘솔에 출력
  • ch.qos.logback.core.FileAppender
    • 파일에 로그 기록. 최대 보관 일 수 등을 지정
  • ch.qos.logback.core.rolling.RollingFileAppender
    • 여러 개의 파일을 rolling(순회)하면서 로그 기록
    • FileAppender를 상속
    • 지정 용량이 넘어간 file을 나누어 저장 가능
  • ch.qos.logback.classic.net.SMTPAppender
    • 로그를 메일로 발송
  • ch.qos.logback.classic.DBAppender
    • Database에 로그 기록

 

 

기타 자세한 내용은 여기에서 참조

 

 

2.2)  root

  • 전역 설정이라고 볼 수 있음
  • 지역적으로 선언된 logger 설정이 있다면 해당 logger 설정이 적용

2.3) logger

  • 지역 설정이라고 볼 수 있음
  • additivity 값은 root 설정 상속 유무 설정(default: true)

2.4) property

  • 설정 파일에서 사용될  변숫값 선언

2.5) layout

  • log의 출력 fomat 지정

2.6) encoder

  • appender에 포함되어 사용자가 지정한 형식으로 표현될 log 메시지를 변환하는 역할을 담당
  • encoder는 바이트를 소유하고 있는 appender가 관리하는 outputStream에 쓸 시간과 내용 제어 가능
  • FileAppender와 하위 클래스는 encoder를 필요로 하고 더 이상 layout은 사용하지 않음
  • 즉, 이제 layout 대신 encoder를 사용

2.7) pattern (패턴에 사용되는 요소)

요소 설명
%Logger{length} Logger name을 축약할 수 있다. {length}는 최대 자리 수, ex)logger{35}
%-5level 로그 레벨, -5는 출력의 고정폭 값(5글자)
%msg 로그 메시지 (=%message)
${PID:-} 프로세스 아이디
%d 로그 기록시간
%p 로깅 레벨
%F 로깅이 발생한 프로그램 파일명
%M 로깅이 발생한 메소드의 명
%l 로깅이 발생한 호출지의 정보
%L 로깅이 발생한 호출지의 라인 수
%thread 현재 Thread 명
%t 로깅이 발생한 Thread 명
%c 로깅이 발생한 카테고리
%C 로깅이 발생한 클래스 명
%m 로그 메시지
%n 줄바꿈(new line)
%% %를 출력
%r 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)

 

 

2.8) file

  • log를 기록할 파일명과 경로를 설정

2.9) rolling

  • ch.qos.logback.core.rolling.TimeBasedRollingPolicy:  일자별 적용
  • ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP:  일자별 + 크기별 적용

2.10) fileNamePattern

  • 파일 쓰기가 종료된 log 파일명의 패턴 지정
  • .gz나 .zip으로 설정 시 자동으로 압축

2.11) maxFileSize

  • 한 파일당 최대 파일  용량 지정
  • log 내용의 크기도 IO 성능에 영향을 미치기 때문에 너무 크지 않은 크기로 지정하는 것이 좋음(10MB 권장)
  • 용량의 단위: KB, MB, GB

2.12) maxHistory

  • 최대 파일 생성 개수
  • ex) maxHistory가 30이고 Rolling 정책을 월 단위로 하면 30개월간 저장

2.13) Filter

  • 특정 패키지에 무조건 로그를 찍는 것 말고 필터링이 필요한 경우 사용

 

 

 

 

 

 

[참고]

goddaehee.tistory.com/206

crazrain.tistory.com/7

docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-logging

 

 

 

 

728x90
loading