[Spring Boot] Logback 사용법 익히기

GinGu-Kang·2022년 8월 2일
0

실제 배포돼 운영되는 웹 어플리케이션에 문제가 발생할 경우 장애가 발생했을때 발생이유와 시점을 모른다면 코드를 일일이 실행시켜 확인해야하기 때문에 시간적,인적 자원낭비를 일으킬수 있습니다. 따라서 로깅 프레임워크 Logback을 공부해 기록된 로그를 활용한 오류 디버깅과 운영 중인 프로그램 상태 모니터링으로 문제지점 파악 시간을 단축시켜 개발 효율성 증대를 이루는것이 이번 공부의 목적입니다!

Logback 이란

Logback이란 오랫동안 검증된 Log4j 아키텍처를 기반으로 개발된 로깅(Logging) 프레임워크 입니다.

Logback의 특징

  • 로깅 Facade인 Sl4j를 지원해 기존 Log4j에서 Logback으로 코드변경없이 라이브러리 스위칭 가능
  • log4j에 비해 10배정도 빠른 퍼포먼스
  • 로그에 특정 레벨 설정
    • Trace -> Debug -> Info -> Warn -> Error
  • 설정 파일을 일정 시간마다 스캔하여 시스템 중단없이 설정 변경 가능
  • 로그보관기간 설정 가능
  • Spring boot에서 기본 로깅 모듈(dependency 추가 필요 x)

Logback의 구조

Spring Boot 에서 Logback 설정 방법

Logback은 일반적으로 classpath의 logback 파일을 참조하지만 Spring boot의 경우 src/main/resources/ 아래에 logback-spring.xml로 설정해야 합니다.

Log Level

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

Logback 설정 파일

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds"> 
 
   <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>
    <encoder>
      <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{30} %msg%n</pattern>
    </encoder>
  </appender>

 <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">

   <file>./application_log/application.log</file> 
   <filter class="ch.qos.logback.classic.filter.LevelFilter">
     <level>INFO</level>
     <onMatch>ACCEPT</onMatch> 
     <onMismatch>DENY</onMismatch> 
   </filter>
   <encoder>
     <pattern>[%d{yyyy-MM-dd HH:mm:ss}:%-3relative][%thread] %-5level %logger{35} - %msg%n</pattern>
   </encoder>
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     <fileNamePattern>./application_log/application.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
		<maxFileSize>50KB</maxFileSize>
        <maxHistory>30</maxHistory>
        <totalSizeCap>5GB</totalSizeCap>
   </rollingPolicy>
 </appender>


   


  <!-- Logger -->  
  <logger name="com.application" level="INFO"/>
  <!-- Root Logger -->  
  <root level="INFO">
    <appender-ref ref="console" />
    <appender-ref ref="rollingFile" />
  </root>
</configuration>

😃 src/main/resources/ 아래에 logback-spring.xml을 생성하고 위설정대로 정의한뒤 재시작 하시면 콘솔창과 파일에 로그가 출력 됩니다. 세부설명은 밑에서 하겠습니다!

Appender

  • Log의 출력 방식과 출력 위치 설정하는 영역
  • Appender 종류
    • ConsoleAppender: 로그를 콘솔에 출력
    • FileAppender: 로그를 파일에 저장
    • RollingFileAppender: 로그를 여러개의 파일을 순회하며 저장
    • SMTPAppender: 로그를 메일로 보냄
    • DBAppender: 데이터베이스에 로그를 저장

📘 가장 많이 쓰이는 것은 콘솔에 출력하는 ConsoleAppender 와 파일에 출력하는 RollingFileAppender 라고 합니다 😁

File

  • 파일을 저장하고 로그를 쓰는 경로

Filter

  • 필터링 정책을 담당함
  • ThresholdFilter
    • 지정된 < level > 아래의 로그는 출력하지 않겠다.
    • ex) Debug 설정시 Trace level은 출력 X
  • 필터링이 필요하지 않을경우 적지않아도 됨
  • LevelFilter
    • < onMatch >ACCEPT</ onMatch >: 해당 레벨만 기록
    • < onMismatch >DENY</ onMismatch >: 다른 수준의 레벨은 기록하지 않음.

Encoder

  • pattern 을 통해 이벤트가 어떤식으로 작성되는지 설정하는 부분

Pattern

  • Pattern에서 작성한 대로 로그를 생성한다.
  • 패턴에 사용되는 요소
    • %Logger{length(최대자리수)}: Logger name을 축약할 수 있다.
    • %thread: 현재 Thread이름
    • %-5level: 로그 레벨, -5는 출력의 고정길이 값 (error 은 5자리 info는 4자리지만 info에 공백을 추가해 5자리로 맞춰준다는 의미)
    • %msg: 로그 메시지
    • %n: 줄바꿈
    • ${PID:-}: 프로세스 아이디
  • 기타
    • %d: 로그 기록시간
    • %p: 로깅 레벨
    • %F: 로깅이 발생한 프로그램 파일명
    • %M: 로깅이 발생한 메소드의 이름
    • %l: 로깅이 발생한 호출지의 정보
    • %c: 로깅이 발생한 카테고리
    • %t: 쓰레드 명
    • %c: 로깅이 발생한 클래스 명
    • %m: 로그 메시지
    • %r: 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간

✱패턴

<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{30} %msg%n</pattern>

✱출력 예시

[2022-08-02 17:09:42.080] [INFO ] [restartedMain] o.s.b.w.e.t.TomcatWebServer Tomcat started on port(s): 8080 (http) with context path ''

Rolling Policy

  • 파일 순회 정책을 정의하는 부분
  • TimeBasedRollingPolicy: 가장 많이 알려진 Rolling Policy 종류중 하나로 시간 기반으로 rollover 단위가 달라짐
  • rollOver: 특정 조건 달성시 기록대상이 다른 파일로 변경됨
  • maxFileSize: 한파일의 최대 저장 용량
  • maxHistory: 한파일의 최대 저장 기간
  • totalSizeCap: 저장소의 최대 크기 지정, 지정 크기 초과시 maxHistory를 먼저 참조해 삭제 maxFileSize가 우선순위가 더 낮음
  • fileNamePattern: 파일 쓰기가 종료된 log 파일명의 패턴 지정
    • 기본 파일명 에서 쓰기 종료시 fileNamePattern 에서 설정된 이름으로 변경
    • fileNamePattern의 dateTime 최소 단위에 따라 rollOver 단위가 달라짐
    • fileName dateTime pattern
    • .%d: default %d는 yyyy-MM-dd: 매일 자정에 새로운 로그 파일로 rollover 해요.
    • .%d{yyyy-MM-dd_HH-mm}:매 분 새로운 로그 파일로 rollover
    • ./%d{yyyy/MM}/foo.txt: 매월 새로운 디렉토리를 만들어 하위에 foo.txt 파일로 rollover
    • .%d.gz: 매일 새로운 로그 파일로 rollover하고, 이전 로그파일은 GZIP으로 압축

✱Rolling Policy

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
     <fileNamePattern>./application_log/application.log.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
     <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
		<maxFileSize>50KB</maxFileSize>
        <maxHistory>30</maxHistory>
        <totalSizeCap>5GB</totalSizeCap>
   </rollingPolicy>

✱출력
maxFileSize: 50KB
fileNamePattern: ./application_log/application.log.%d{yyyy-MM-dd}.%i.log

50kb 초과시 기존 파일의 이름이 fileNamePattern에 작성된 대로 변경되어 저장되고 새로운 파일로 rollOver됨

Root

  • 전역의 log 출력 level을 설정
  • appender-ref에 명명된 어펜더만 root 로거에 추가됨
  • 지역 설정을 할때는 < logger > 사용

✱Root

<logger name="com.application" level="INFO"/>
  
  <root level="INFO">
    <appender-ref ref="console" />
    <appender-ref ref="rollingFile" />
  </root>

logback을 사용해보고 정리해보는 시간을 가져보았습니다! 첫포스팅이라 굉장히 어색하고 부끄럽습니다..ㅎ 틀리거나 문제 될게 있다면 지적해주시면 감사하겠습니다 🥹 다들 좋은하루 보내시고 대성하시길 바랍니다 ! 파이팅

참고

https://jeong-pro.tistory.com/154 [기본기를 쌓는 정아마추어 코딩블로그]
https://wbluke.tistory.com/51
https://ckddn9496.tistory.com/79 [초보개발자 긍.응.성]

profile
인생을 힘차게!!!👊 파이팅 넘치는 프로그래머 강진구 입니다!!

0개의 댓글