🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃
로그를 남길 때 println() 대신 로깅 프레임워크를 사용해야 하는 이유
- 로그 레벨 관리: 로깅 프레임워크는 다양한 로그 레벨을 제공하여 로그 메시지의 중요도에 따라 필요한 로그만 출력
- 로그 출력 제어: 로깅 프레임워크는 로그를 어디에(콘솔, 파일, 데이터베이스 등) 출력할지 제어 가능
- 성능 향상: 로그를 출력할 때 문자열 연산('+') 대신 '{}' 활용해서 메모리 낭비를 줄임
logger.info("User: {} - Age: {}", name, age);
SLF4J
- SLF4J(Simple Logging Façade For Java)란 Logging Framework들을 추상화해 놓은 것
- 로깅 프레임워크를 연결하는 바인딩 모듈을 통해 로깅 프레임워크(Logback, Log4j, java.util.logging 등)을 지원
Log Level
- 현재 레벨의 로그부터 더 높은 레벨의 로그까지 출력하며 동작
trace
- 가장 낮은 로그 레벨로서, 애플리케이션 동작 상세 정보 제공
- 내부 동작을 추적하고 문제 해결을 하는 디버깅 목적으로 사용되며, 운영 환경에서는 비활성화하거나 최소화
debug
- 디버깅 목적으로 사용
- 개발 및 테스트에서 활성화
info
- 애플리케이션 주요 이벤트나 상태 정보(애플리케이션 시작 또는 중요한 작업의 완료) 기록
- 운영 환경에서 이 레벨을 사용 가능
warn
- 경고 레벨로서, 예상치 못한 상황 발생을 나타냄
- 애플리케이션의 정상 작동에는 영향을 주지 않지만 주의가 필요한 상황을 알림
error
- 오류 레벨로서, 애플리케이션에서 심각한 오류(예외) 발생을 알림
예시 코드
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ExampleClass {
private static final Logger logger = LoggerFactory.getLogger(ExampleClass.class);
public void exampleMethod() {
logger.debug("This is a debug log message");
logger.info("This is an info log message");
logger.warn("This is a warn log message");
logger.error("This is an error log message");
}
}
로그 Appender 설정 (resources 폴더 하위)
logback.xml 설정
<configuration>
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{36} %msg%n"></property>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<file>logs/logfile.log</file>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/logfile-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ROLLING_FILE" />
</root>
</configuration>
yml 설정
logging:
level:
root: info
com.example: debug
file:
name: /path/to/logfile.log
pattern:
console: "%d [%thread] %-5level %logger{35} - %msg%n"
appenders:
console:
type: console
file:
type: file
fileName: /path/to/logfile.log
rollingFile:
type: rollingFile
fileName: /path/to/logfile.log
filePattern: /path/to/logfile-%d{yyyy-MM-dd}.log
appender
- ConsoleAppender: 로그 이벤트를 콘솔에 출력
- FileAppender: 로그 이벤트를 파일에 저장
- RollingFileAppender: 로그 이벤트를 일정 크기로 분할된 파일에 저장하고, 파일의 백업과 롤링을 수행
스프링 부트 로그 설정
logging:
level:
org.springframework.web: debug
org.hibernate: error
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
공식 문서 참고
- 스프링부트를 사용하면 기본적으로 Logback이 사용되고 SLF4J를 이용 가능