[6/23 TIL] SPRING(SLF4J)

yumyeonghan·2023년 6월 26일
0

🍃프로그래머스 백엔드 데브코스 4기 교육과정을 듣고 정리한 글입니다.🍃

로그를 남길 때 println() 대신 로깅 프레임워크를 사용해야 하는 이유

  1. 로그 레벨 관리: 로깅 프레임워크는 다양한 로그 레벨을 제공하여 로그 메시지의 중요도에 따라 필요한 로그만 출력
  2. 로그 출력 제어: 로깅 프레임워크는 로그를 어디에(콘솔, 파일, 데이터베이스 등) 출력할지 제어 가능
  3. 성능 향상: 로그를 출력할 때 문자열 연산('+') 대신 '{}' 활용해서 메모리 낭비를 줄임
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 {
	// 롬복의 @Slf4j 사용해서 생략 가능
    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 설정

<!-- 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 설정

# application.yml

logging:
  level:
    root: info  # 최상위 패키지의 로그 레벨을 'info'로 설정
    com.example: debug  # com.example 패키지의 로그 레벨을 'debug'로 설정

  file:
    name: /path/to/logfile.log  # 파일 로그의 경로와 이름을 설정

  pattern:
    console: "%d [%thread] %-5level %logger{35} - %msg%n"  # 콘솔 로그의 출력 형식을 설정

  appenders:  # 로그 이벤트를 어떻게 처리할지를 정의
    console:  # ConsoleAppender 설정
      type: console  # 앱던더 타입을 'console'로 설정

    file:  # FileAppender 설정
      type: file  # 앱던더 타입을 'file'로 설정
      fileName: /path/to/logfile.log  # 로그 파일의 경로와 이름을 설정

    rollingFile:  # RollingFileAppender 설정
      type: rollingFile  # 앱던더 타입을 'rollingFile'로 설정
      fileName: /path/to/logfile.log  # 로그 파일의 경로와 이름을 설정
      filePattern: /path/to/logfile-%d{yyyy-MM-dd}.log  # 백업 로그 파일의 경로와 이름 패턴을 설정

appender

  • ConsoleAppender: 로그 이벤트를 콘솔에 출력
  • FileAppender: 로그 이벤트를 파일에 저장
  • RollingFileAppender: 로그 이벤트를 일정 크기로 분할된 파일에 저장하고, 파일의 백업과 롤링을 수행

스프링 부트 로그 설정

# application.yml

logging:
  level:
    org.springframework.web: debug
    org.hibernate: error
# application.properties

logging.level.org.springframework.web=debug
logging.level.org.hibernate=error

공식 문서 참고

  • 스프링부트를 사용하면 기본적으로 Logback이 사용되고 SLF4J를 이용 가능
profile
웹 개발에 관심 있습니다.

0개의 댓글