정의
- Java 기반 오픈 소스 로깅 라이브러리 ⇒ Java 애플리케이션에서 로그 기록 및 관리를 위한 도구
- SLF4J의 구현체이자, Spring Boot의 기본 로깅 프레임워크
※ SLF4J(Simple Logging Facade for Java) = Java 애플리케이션에서 로깅을 추상화하기 위한 인터페이스
※ Spring Boot는 내장 Tomcat의 로그와 애플리케이션의 로그를 분리하여 관리하기 때문에 두 로깅 시스템 간의 중복 로그 출력은 발생하지 않아 Spring Boot의 로깅 설정을 변경하더라도 내장 Tomcat의 로깅에는 영향을 미치지 않고 그 반대의 경우에도 영향을 미치지 않음.
사용 예시 코드
import org.slf4j.Logger; // 실제 로그 메시지를 생성하고 출력하는 주요 인터페이스
import org.slf4j.LoggerFactory; // Logger 인스턴스를 생성하는 팩토리 클래스
public class testController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
logger.trace("Trace 로그");
logger.debug("Debug 로그");
logger.info("Info 로그");
logger.warn("Warn 로그");
logger.error("Error 로그");
}
특징
- 유연성과 다양한 출력 형식 지원: Logback은 다양한 로그 메시지 출력 형식을 지원하며, 로그 데이터를 파일, 콘솔, 원격 서버, 데이터베이스 등 다양한 대상으로 출력 가능. 이를 통해 로그 데이터를 다양한 형식으로 저장하거나 실시간 모니터링할 수 있습니다.
- 로그 레벨 관리: Logback은 로그 메시지에 대한 다양한 레벨을 지원하는데 일반적으로 TRACE, DEBUG, INFO, WARN, ERROR 등 다양한 레벨을 사용하여 로그 메시지의 중요도를 표시하고, 필요에 따라 레벨별로 로그 메시지를 출력하거나 무시할 수 있음
- 성능: 내부적으로 비동기 로깅을 지원하여 로깅 작업이 주 애플리케이션 스레드와 별도로 처리될 수 있어 로깅 작업이 애플리케이션의 성능에 미치는 영향을 최소화할 수 있는 높은 성능을 제공함
- 설정 가능한 로깅: Logback은 XML 또는 Groovy 설정 파일을 사용하여 로깅 구성을 지정할 수 있고 이를 통해 로그 레벨, 출력 형식, 대상 출력 장치 등을 쉽게 구성할 수 있음
- 패턴 레이아웃: Logback은 로그 메시지의 출력 형식을 패턴 레이아웃을 사용하여 유연하게 지정할 수 있는데
예를 들어, 날짜, 시간, 로그 레벨, 클래스 이름, 메서드 이름 등을 원하는 대로 출력 형식에 포함시킬 수 있음 - 로깅 이벤트 필터링: Logback은 로그 이벤트를 필터링하여 특정 조건을 만족하는 이벤트만 로깅할 수 있으며 이를 통해 로그 데이터의 양을 줄이거나 특정 상황에서만 로깅을 활성화할 수 있음
- 외부 설정 및 확장 가능성: Logback은 다양한 확장 모듈을 지원하며, 외부 애플리케이션에서 로깅 설정을 변경하거나 확장할 수 있음
로그 설정 방법
- Spring Boot에서는 대부분의 로깅 설정이 자동으로 이루어지며 원하는 로깅 구성이 있을 경우 src/resources 에 다음과 같은 파일을 생성해 설정이 가능함
- application.properties 혹은 application.yml에 설정 => 간단한 설정 시
- logback-spring.xml에 설정 ⇒ 상세한 설정 시
※ 1과 2 모두 적용 시 1이 우선적으로 실행됨
로그 레벨
TRACE < DEBUG < INFO < WARN < ERROR
- TRACE = DEBUG 보다 더 상세한 추적 로그
- DEBUG = 디버깅 정보 로그
- INFO = 정보성 로그 표시
- WARN = 처리 가능한 문제 & 향후 에러의 원인이 될 수 있는 경고성 로그
- ERROR = 에러 로그
- 레벨을 설정할 경우 해당 레벨보다 낮은 로그는 표시 X
로그 패턴
- %-5level = 로그 레벨 (-5 ⇒ 5글자)
- %p = 로그 레벨
- %d{패턴} = 지정한 패턴으로 로그가 발생한 날짜/시간 출력
- %logger = 패키지 포함 클래스 정보
- %logger{0} = 패키지를 제외한 클래스 이름만 출력
- %logger{length} = Logger name을 축약, {length}는 최대 자리 수
- ${PID:-} = 프로세스 아이디
- %d = 로그 기록 시간 출력
- %F = 로그가 발생한 프로그램 파일명 출력
- %M = 로그가 발생한 메소드의 명 출력
- %line = 로그가 발생한 호출지의 라인(=%L)
- %thread = 로그가 발생한 Thread 명(=%t)
- %c = 로그가 발생한 카테고리
- %C = 로그가 발생한 클래스 명
- %msg = 로그 메시지 (=%message, %m)
- %n = 개행(new line)
- %r = 애플리케이션 시작 이후부터 로깅이 발생한 시점까지의 시간(ms)
- %i = 롤링 순번 자동 지정
logback-spring.xml
- Logback 로깅 라이브러리와 스프링 프레임워크의 통합을 위해 사용되는 XML 파일
- 로깅에 대해 상세한 설정이 가능하도록 함
logback-spring.xml의 Tag 종류
<configuration>
- logback 환경 변수 설정에 대한 선언 (가장 바깥쪽 태그)
- scan = 변경 사항 스캔 여부 지정 (true/false)
- scanPeriod = 스캔 주기 지정 (밀리초 단위, scan=”true” 필수)
<appender>
- 로그의 형태 및 로그 메시지가 출력될 대상을 지정
- 클래스 종류
- ch.qos.logback.core.ConsoleAppender = 콘솔
- ch.qos.logback.core.FileAppender = 파일 (새로운 로그 이벤트 발생 시 기존 파일에 업데이트)
- ch.qos.logback.core.rolling.RollingFileAppender = 파일 (새로운 로그 이벤트 발생 시 새 파일 생성하여 업데이트)
- ch.qos.logback.classic.net.SMTPAppender = 메일
- ch.qos.logback.classic.DBAppender = DB
<root>, <logger>
- root = 전역 설정, logger = 지역 설정 (특정 패키지)
- <appender-ref>를 통해 정의한 <appender>를 적용시킬 수 있음
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>foo.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<logger name="chapters.configuration.Foo" additivity="false"> <!-- 상위 로거로 전달 방지 -->
<appender-ref ref="FILE" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
<springProperty>
- 사용될 변수 설정 (application.properties나 application.yml에서 프로퍼티 값 불러와 설정)
- scope = 범위 지정 (주로 context 사용)
- name = 이름 지정
- source = application.properties나 application.yml에서 지정한 변수 지정
<property>
- 사용될 변수 설정
- resource 파라미터를 통해 외부 파일을 불러와 ${}로 데이터를 불러와 적용 가능
<encoder>
- 로그 메시지 포맷(패턴) 설정
- 하위에 <charset> 태그로 인코딩 방식 지정
- 클래스 종류
- ch.qos.logback.classic.encoder.PatternLayoutEncoder
- 로그 이벤트를 정의한 패턴에 따라 문자열로 변환
- Appender에서 지정한 파일이 .log 형식인 경우
- 하위에 <pattern> 태그로 메시지 출력 패턴 입력 필수
<configuration>
<!-- omitted lines ... -->
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>foo.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d %-5level [%thread] %logger{0}: %msg%n</pattern>
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
</appender>
<!-- omitted lines ... -->
</configuration>
- ch.qos.logback.classic.encoder.JsonEncoder
- 로그 이벤트를 JSON 형식으로 변환
- Appender에서 지정한 파일이 .json 형식인 경우
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>foo.json</file>
<encoder class="ch.qos.logback.classic.encoder.JsonEncoder"/>
</appender>
</configuration>
<file>
- 사용할 파일 경로 지정
<totalSizeCap>
- 모든 로그 파일의 크기의 총합에 대해 최대 용량(KB, MB, GB) 지정
<maxFileSize>
- 로그 파일 최대 용량(KB, MB, GB) 지정
<maxHistory>
- 최대 보관 주기(일 단위) 지정
<rollingPolicy>
- 롤링 정책 지정 ⇒ 롤링(rolling) = 로그 파일을 일정 단위로 갱신하는 작업
- 클래스 종류
- ch.qos.logback.core.rolling.TimeBasedRollingPolicy = 시간 기반
- ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy = 크기 기반
- ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP = 크기&시간 기반 (패턴)
- ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy = 크기&시간 기반 (롤링)
- ch.qos.logback.core.rolling.FixedWindowRollingPolicy = 로그 파일 개수 고정
- <TimeBasedFileNamingAndTriggeringPolicy>
- TimeBasedRollingPolicy를 rollingPolicy로 지정한 후 추가적으로 로그 파일의 용량을 지정하고 싶은 경우 SizeAndTimeBasedFNATP를 클래스로 지정 후 하위 태그로 입력
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
${LOG_PATH}/${ERR_LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>60</maxHistory>
</rollingPolicy>
<fileNamePattern>
- 로그 파일명에 대한 패턴 입력
- %d(날짜 관련 패턴), %i(롤링 순번 관련 패턴) 입력 필수
- ex) {LOG_FILE_NAME}.%d{yyyy-MM-dd}_%i.log
<filter>
- 필터 설정
- FilterReply = Filter의 반환값 (Enum 타입)
- DENY = 남아있는 Filter에 대하여 검증 중지하고 로그 이벤트 취소
- NEUTRAL = 다음 Filter에게 검증을 넘김 (다음 Filter가 없다면 로그 이벤트 정상 처리)
- ACCEPT = 남아있는 Filter에 대하여 검증 중지하고 로그 이벤트 동작
★ Filter 클래스 종류 ★
Regular filters
- ch.qos.logback.classic.filter.LevelFilter
- 로그 레벨 필터링 (기준 레벨과 동일해야 통과)
- level = 로그 레벨 설정
- onMatch = 설정한 레벨과 일치하는 경우에 대한 설정
- onDisMatch = 설정한 레벨과 일치하지 않는 경우에 대한 설정
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} -%kvp -%msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
- ch.qos.logback.classic.filter.ThresholdFilter
- 로그 레벨 필터링 (기준 레벨 이상이어야 통과)
- level = 로그 레벨 설정
<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender">
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger{30} -%kvp -%msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
EvaluatorFilter
- ch.qos.logback.classic.boolex.GEventEvaluator
- 조건을 개발자가 직접 설정 (반환 타입 : boolean, 언어 : Groovy)
- ch.qos.logback.classic.boolex.JaninoEventEvaluator
- 조건을 개발자가 직접 설정 (반환 타입 : boolean, 언어 : Java, 기본값)
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.core.filter.EvaluatorFilter">
<evaluator> <!-- defaults to type ch.qos.logback.classic.boolex.JaninoEventEvaluator -->
<expression>return message.contains("billing");</expression>
</evaluator>
<OnMismatch>NEUTRAL</OnMismatch>
<OnMatch>DENY</OnMatch>
</filter>
<encoder>
<pattern>
%-4relative [%thread] %-5level %logger -%kvp -%msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
TurboFilters
- ch.qos.logback.classic.filter.DynamicThresholdFilter
- 특정 조건에 따라 로그 레벨을 변경하여 필터링
- ch.qos.logback.core.filter.MarkerFilter
- 특정 marker(문구)를 이용하여 필터링
- ch.qos.logback.classic.turbo.DuplicateMessageFilter
- 이전 로그 이벤트 메시지와 현재 로그 이벤트 메시지를 비교하여 지정된 중복 횟수 초과 시 중복되는 메시지 삭제
- ch.qos.logback.classic.filter.MDCFilter
- 특정 MDC(Mapped Diagnostic Context)값을 이용하여 필터링
- ch.qos.logback.classic.filter.ReconfigureOnChangeFilter
- 설정 파일을 동적으로 변경할 때 필터링
Logback 공식문서
https://logback.qos.ch/manual/index.html
Logback Manual
The logback manual The complete logback manual documents the latest version of logback framework. In over 150 pages and dozens of concrete examples, it covers both basic and advanced logback features, including: the overall logback architecture discussion
logback.qos.ch
'Spring' 카테고리의 다른 글
log4jdbc (1) | 2023.09.14 |
---|---|
logback-spring.xml 로그 파일 level별 설정 문제 (0) | 2023.09.13 |
의존성 주입 방식 (0) | 2023.05.25 |
JWT (0) | 2023.05.25 |
Spring Security 기본 로그인 구현 중 실수 정리 (0) | 2023.05.11 |
댓글