[Spring] Logback 설정
- -
Spring Boot Logback 설정
Logback
로깅 프레임워크 중 하나로 SLF4J의 구현체이다.
Logback은 logback-core
, logback-classic
, logback-access
의 3가지 모듈로 나뉜다.logback-core
는 다른 두 모듈을 위한 기반 역할을 한다. Appender
와 Encoder(Layout)
인터페이스가 속한다.logback-classic
은 core에서 확장된 모듈로, core와 SLF4J API 라이브러리를 가진다. Logger
클래스가 여기에 속한다.logback-access
는 서블릿 컨테이너와 통합되어 HTTP 액세스에 대한 로깅 기능을 제공한다.
Logback을 이용하여 로깅을 수행하기 위해 필요한 주요 설정 요소로는 Logger, Appender, Encoder 3가지가 있다.
Logger
Logger
는 실제 로깅을 수행하는 구성요소이다.ch.pos.logback.classic.Level
클래스에 Logger
가 사용 가능한 다섯 가지 레벨(TRACE
, DEBUG
, INFO
, WARN
, ERROR
)이 정의되어 있다. Level
을 통해 출력할 로그의 레벨을 조절할 수 있다. 각 Level
은 TRACE < DEBUG < INFO < WARN < ERROR
이며, 지정한 레벨보다 작은 레벨의 로그는 기록되지 않는다.
ERROR
: 요청을 처리하는 중 오류가 발생한 경우 표시WARN
: 처리 가능한 문제, 향후 시스템 에러 원인이 될 수 있는 경고성 메시지 표시INFO
: 상태변경과 같은 정보성 로그 표시DEBUG
: 프로그램을 디버깅하기 위한 정보를 표시TRACE
: Debug보다 훨씬 상세한 정보를 표시
Appender
Appender
는 로그 메시지가 출력될 대상을 결정하는 역할을 한다. Appender
는 다음과 같은 종류가 있다.
ConsoleAppender
: 콘솔에 로그 출력FileAppender
: 파일 단위로 로그 저장RollingFileAppender
: 설정 옵션에 따라 로그를 여러 파일로 나누어 저장SMTPAppender
: 로그를 메일로 전송하여 기록DBAppender
: 로그를 DB에 저장
Encoder
Encoder
는 로그 이벤트를 바이트 배열로 변환하고, 해당 바이트 배열을 Output Stream에 쓰는 작업을 담당한다.Appender
에 포함되어 사용자가 지정한 형식으로 표현 될 로그 메시지를 변환하는 역할을 담당한다.
Spring-Boot Logback Settings
스프링에서 Logback 설정을 위해 logback-spring.xml
을 작성할 수 있다.logback.xml
을 사용하게 되면 스프링 설정 전에 Logback 설정이 먼저 완료되어 로그 제어가 어려워질 수 있다.
Dynamic Reloading
dynamic reloading
기능을 지원한다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds">
<!-- 60초 주기로 파일을 검사하여 바뀌었으면 프로그램을 갱신한다. -->
<!-- ...logback settings... -->
</configuration>
Appender 설정
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds">
<!-- appender 설정 -->
<!-- ConsoleAppender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 로그 출력 패턴 설정 -->
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n
</pattern>
</encoder>
</appender>
<!-- FileAppender -->
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 로그를 기록할 파일명과 경로 설정 -->
<file>./log/info/info-%d{yyyy-MM-dd}.log</file>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n
</pattern>
<charset>UTF-8</charset>
<!-- 헤더에 패턴 출력 -->
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
<!-- 로그 필터링 설정 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- INFO 레벨의 로그만 파일에 기록 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- Rolling 정책 결정 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 파일 쓰기가 종료된 log 파일명의 패턴 지정. '.gz', '.zip'과 같이 지정하면 자동 압축 -->
<fileNamePattern>
./log/info/info-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<!-- 파일당 최대 용량 -->
<maxFileSize>10MB</maxFileSize>
<!-- 로그파일 최대 보관 주기(일). 해당 설정일 이상 지나면 로그파일 자동 삭제 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 설정한 appender 적용 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE-INFO"/>
</root>
</configuration>
Property
property
: 설정 파일에서 사용될 변수값을 선언한다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- property 선언 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n"/>
<property name="LOG_CHARSET" value="UTF-8"/>
<property name="LOG_FILE_PATH" value="./log"/>
<timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
<!-- appender 설정 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- property 사용 -->
<pattern>${LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset>
</encoder>
</appender>
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- property 사용 -->
<file>${LOG_FILE_PATH}/info-${BY_DATE}.log</file>
<encoder>
<!-- property 사용 -->
<pattern>${LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset>
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- property 사용 -->
<fileNamePattern>${LOG_FILE_PATH}/info-${BY_DATE}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE-INFO"/>
</root>
</configuration>
Logger 설정
root
와 logger
를 통해 설정할 수 있다.
root
: 전역 설정. 지역 설정인logger
가 선언되면 해당logger
설정이 default로 적용된다.logger
: 지역 설정. 특정 패키지의logger
를 설정할 수 있다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!-- ...other settings... -->
<!-- root level 설정 -->
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
<!-- 특정 패키지 logging level 설정 -->
<!-- additivity 값은 root 설정 상속 유무를 결정하는 속성이다. default 값은 true -->
<logger name="com.example.demo.service" level="debug" additivity="false">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE-INFO"/>
</logger>
</configuration>
Profile별 설정 분리
srpingProfile
을 통해 Profile별로 Logger
, Appender
설정을 분리할 수 있다.
<?xml version="1.0" encoding="UTF-8" ?>
<configuration scan="true" scanPeriod="60 seconds">
<!-- property 선언 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${PID:- } --- %logger: %-5line : %m%n"/>
<property name="LOG_CHARSET" value="UTF-8"/>
<property name="LOG_FILE_PATH" value="./log"/>
<timestamp key="BY_DATE" datePattern="yyyy-MM-dd"/>
<!-- 로컬 환경 logger settings -->
<springProfile name="local">
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset>
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- 운영 환경 logger settings -->
<springProfile name="prod">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE_PATH}/info-${BY_DATE}.log</file>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset>
<outputPatternAsHeader>true</outputPatternAsHeader>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- property 사용 -->
<fileNamePattern>${LOG_FILE_PATH}/info-${BY_DATE}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
Logback 출력 로그 색상 변경
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<!-- %clr(...){cyan} 과 같이 사용할 수 있다. %clr() 내부의 내용이 지정한 색상으로 출력된다. -->
<!-- 사용 예 -->
<property name="LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}: %-5line){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
참고 사이트 : https://oingdaddy.tistory.com/257
'framework > spring' 카테고리의 다른 글
[Spring] Spring REST Docs, Swagger 조합. restdocs-api-spec (0) | 2023.01.08 |
---|---|
[Spring] Web-Socket, SockJS, STOMP 이론 (0) | 2023.01.06 |
[Spring] 마이바티스(MyBatis) (0) | 2022.12.11 |
[Spring] JDBC Template (0) | 2022.12.10 |
[Spring] 애플리케이션 실행시 DB 테이블 및 데이터 입력 (0) | 2022.12.10 |
소중한 공감 감사합니다