ㅅㅇ
[Spring Boot] 로그 처리 Logback 본문
Logback
- 로그에 특정 레벨을 설정할 수 있음.
- Trace -> Debug -> Info -> Warn -> Error
- 왼쪽으로 갈수록 가벼운 로그, 오른쪽으로 갈수록 위험한 에러. 중요도를 뜻함.
- 실 운영과 테스트 상황에서 각각 다른 출력 레벨을 설정하여 로그를 확인할 수 있음
- 다르게 하는 이유는?
- 테스트 할 때는 자세한 내용을 파악해야 하기 때문에 DEBUG 정도의 레벨로 설정하여 개발을 수정 보완한다. 근데 DEBUG 로 찍으면 로그가 많이 나와 실제 퍼포먼스가 낮아진다. 그렇기에 실 운영에서는 INFO나 WARN 레벨로 설정하여 로그를 확인
- 다르게 하는 이유는?
- 출력 방식에 대해 설정할 수 있음.
- 콘솔, 메일, 파일, 데이터베이스 등
- 설정 파일을 일정 시간마다 스캔하여, 어플리케이션 중단 없이 설정 변경 가능
- 스캔 주기 설정이 가능하여, 몇 초 단위로 설정 파일을 스캔을 해서 설정 값을 변경할 수 있다. 이때, 어플리케이션 중단이 없다는 것은 중요한 포인트이다. 실 운영으로 어플리케이션이 가동되고 있을때, 어플리케이션이 중단된다면 서비스가 먹통이 될 것이다. 로그백은 중단 없이 설정을 변경 가능하기에 아주 큰 장점이다.
- 별도의 프로그램 없이 자체적으로 로그 압축을 지원
- 로그가 많이 쌓였을 때 이 용량을 확보하기 위해 사용되는 기능인데, 별도의 프로그램없이 로그백에서 지원한다.
- 로그 보관 기간 설정 가능
- 설정한 기간이 지나면 로그 파일이 삭제되게 기간을 설정한다.
- 스프링부트에 내장 되어 있어 별도의 라이브러리 설정 필요 없다.
Logback 설정
일반적으로 Classpath 에 있는 logback 설정 파일을 참조하게 됨.
- Java Legacy, Spring 의 경우, xml파일을 참조
- SpringBoot 의 경우, logback-spring.xml파일을 참조 - 절대적인 건 아니고 설정을 변경함으로써 원하는 파일을 참조하도록 할 수 있다.
로그 레벨
- ERROR : 로직 수행 중에 오류가 발생한 경우, 시스템적으로 심각한 문제가 발생하여 작동이 불가한 경우
- WARN : 시스템 에러의 원인이 될 수 있는 경고 레벨, 처리 가능한 사항
- INFO : 상태 변경과 같은 정보성 메시지. 정보를 전달하기 위한 로그 레벨
- DEBUG : 어플리케이션의 디버깅을 위한 메시지 레벨
- TRACE : DEBUG 레벨보다 더 디테일한 메시지를 표현하기 위한 레벨. 많이 사용되지는 않음.
- INFO를 설정하면 ERROR과 WARN 이 출력 되고 DEBUG 와 TRACE는 출력 되지 않음.
Logback 구조
- appender : Log 의 형태 및 어디에 출력할 지 설정
- 대표적인 Appender 형식은 아래와 같음.
- ConsoleAppender : 콘솔에 로그를 출력
- FileAppender : 파일에 로그를 저장
- RollingFileAppender : 여러 개의 파일을 순회하며 로그를 저장
- SMTPAppender : 로그를 메일로 보냄
- DBAppender : 데이터베이스에 로그를 저장
- encoder : Appender 내에 포함되는 항목이며, pattern 을 사용하여 원하는 형식으로 로그를 표현할 수 있음.
- root : 설정한 Appender 를 참조하여 로그의 레벨을 설정할 수 있음.
- root 는 전역 설정, logger 는 지역설정이 가능하다.
- 지역 설정의 경우 특정 패키지마다 특정 레벨을 사용하라는 설정이 가능하다.
Pattern
Pattern | 의미 |
%logger{length} | LoggerName. 경로의 경우 길기에 보통 글자 수 제한한다. |
%-5level | 로그 레벨. -5 는 출력의 고정폭 값을 뜻함. |
%msg (%message) | 로그 메시지 영역 |
${PID:-} | 프로세스 id |
%d | 로그 기록 시간 |
%p | 로깅 레벨 |
%F | 로깅이 발생한 프로그램 파일명 |
%M | 로깅이 발생한 메소드의 이름 |
%I | 로깅이 발생한 호출지의 정보 |
%L | 로깅이 발생한 호출지의 라인수 |
%thread | 현재 Tread 명 |
%t | 로깅이 발생한 Thread 명 |
%c | 로깅이 발생한 카테고리 |
%C | 로깅이 발생한 클래스 명 |
%m | 로그 메세지 |
%n | 줄바꿈 |
%% | % 출력 |
%r | 어플리케이션 실행 후 로깅이 발생한 시점까지의 시간 |
encoder - Pattern 예시
EX) /…/src/main/resources/logback-spring.xml
<!-- console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>DEBUG</level>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{30} %msg%n</pattern>
</encoder>
</appender>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger{30} %msg%n</pattern>
- %-5level : 로그 레벨. -5 는 출력의 고정폭 값을 뜻함. 레벨의 글자수가 다르기에 크기가 안 맞다. 모든 로그가 일정한 크기로 출력 되길 원하기에 –5로 레벨의 출력 고정폭 값을 설정한다.
- %thread : 멀티쓰레딩을 하고 있기에 어떤 쓰레드에서 어떤 문제가 발생했는지 추적해서 살펴보기 위해서 현재 쓰레드 명을 찍는다.
- %logger: 로거의 이름. 클래스에 로거을 설정 했을 때 어떤 이름으로 받게 되는지 / 흔히 경로 ~.controller.HeolloController
- %msg : 로그 메시지 영역
- %n : 줄바꿈
출력 결과 예시
[2023-01-26 19:10:52.547] [WARN ] [http-nio-8080-exec-3] io.star.model.ELKService [ELKService][getData] - ElasticSearch 9200 서버 꺼져있음. :: Response = ResponseEntity<ErrorResponse> :: 1046ms
- GIT 예제 코드
'SW_STUDY > SpringBoot' 카테고리의 다른 글
[Spring Securtiy] Spring Securtiy FilterChain필터 (0) | 2023.03.08 |
---|---|
[Spring Securtiy] Spring Securtiy 기본 개념 (0) | 2023.03.08 |
[Spring Boot] 예외 처리 ExceptionHandler 예시 (0) | 2023.01.31 |
[Spring Boot] 예외 처리 ExceptionHandler 개념 (0) | 2023.01.31 |
[Spring Boot] 유효성 검사 & 데이터 검증 Vaildation (0) | 2023.01.28 |