[Day 26 | Spring] Spring Boot - Logging

y♡ding·2024년 11월 18일

데브코스 TIL - Spring

목록 보기
12/46

Logging :: Spring Boot

스프링 부트는 기본적으로 로깅(logging) 설정을 자동으로 제공하여 애플리케이션의 로그를 쉽게 관리할 수 있게 해줍니다. 스프링 부트는 SLF4J(Simple Logging Facade for Java)를 기본 로깅 API로 사용하며, 기본 로깅 구현으로 Logback을 사용합니다. 이를 통해 개발자는 로깅 설정을 빠르게 적용하고, 필요에 따라 커스터마이징할 수 있습니다.

1. 스프링 부트 기본 로깅 설정

  • 기본 로깅 라이브러리: 스프링 부트는 SLF4JLogback을 자동으로 구성하여 제공합니다.
  • 로그 출력 포맷: 기본적으로 콘솔에 로그가 출력되며, 로깅 레벨, 스레드 이름, 로거 이름, 메시지 등이 포함됩니다.
  • 기본 로깅 레벨: 스프링 부트는 디폴트 로깅 레벨로 INFO를 사용합니다. 따라서 INFO, WARN, ERROR 레벨의 로그만 출력되며, DEBUGTRACE는 기본적으로 출력되지 않습니다.

2. 로깅 레벨 설정

스프링 부트에서는 각 패키지나 클래스별로 로깅 레벨을 설정할 수 있습니다. 이를 통해 특정 패키지나 클래스의 로그를 더 자세히 출력하거나, 특정 로그를 제외할 수 있습니다.

application.properties에서 설정

# 전체 로그 레벨을 WARN으로 설정
logging.level.root=WARN

# org.springframework 패키지의 로그 레벨을 DEBUG로 설정
logging.level.org.springframework=DEBUG

# com.example 패키지의 로그 레벨을 INFO로 설정
logging.level.com.example=INFO

주요 로깅 레벨

  • TRACE: 가장 낮은 레벨로, 상세한 로깅이 필요한 경우 사용합니다.
  • DEBUG: 디버깅 정보 로깅에 사용되며, 개발 중에 유용합니다.
  • INFO: 일반적인 애플리케이션 실행 정보로, 기본적으로 중요한 정보만 출력합니다. (기본값)
  • WARN: 경고성 메시지를 출력하며, 애플리케이션에 잠재적인 문제가 있을 때 사용합니다.
  • ERROR: 오류가 발생했을 때만 출력됩니다.

3. 콘솔과 파일에 로그 출력

스프링 부트는 기본적으로 로그를 콘솔에 출력하지만, 파일로 로그를 남길 수도 있습니다.

application.properties에서 로그 파일 설정

# 로그를 저장할 파일 경로
logging.file.name=app.log

# 로그를 저장할 디렉토리 (파일명이 지정되지 않으면 기본 파일명으로 로그 생성)
logging.file.path=/var/log/myapp

이 설정을 추가하면 로그가 app.log 파일에 저장되며, 콘솔과 파일에 동시에 출력됩니다. logging.file.namelogging.file.path 중 하나만 설정할 수도 있습니다.

Logger

Logger는 스프링 부트 및 자바 애플리케이션에서 로그 메시지를 기록하고 관리하는 데 사용되는 주요 구성 요소입니다. 스프링 부트는 기본적으로 SLF4J(Simple Logging Facade for Java) API를 사용하며, 실제 로깅 구현은 Logback을 통해 이루어집니다. Logger를 사용하여 애플리케이션의 상태와 흐름을 추적할 수 있으며, 디버깅, 오류 추적 및 운영 시 필요한 정보를 로그에 남길 수 있습니다.

1. Logger 설정 및 사용법

스프링 부트에서 Logger를 사용하려면, 다음과 같이 클래스에 Logger 객체를 생성하여 사용합니다. SLF4J의 LoggerFactory를 사용해 로거를 생성하는 것이 일반적입니다.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private static final Logger logger = LoggerFactory.getLogger(MyService.class);

    public void performTask() {
        logger.info("작업이 시작되었습니다.");

        try {
            // 로직 수행
            logger.debug("세부 작업 진행 중...");
        } catch (Exception e) {
            logger.error("작업 중 오류 발생", e);
        }

        logger.info("작업이 완료되었습니다.");
    }
}
  • LoggerFactory.getLogger(MyService.class): 클래스 이름을 기반으로 Logger 객체를 생성합니다.
  • 로그 레벨별 메서드:
    • logger.trace("메시지"): TRACE 레벨 메시지 기록
    • logger.debug("메시지"): DEBUG 레벨 메시지 기록
    • logger.info("메시지"): INFO 레벨 메시지 기록
    • logger.warn("메시지"): WARN 레벨 메시지 기록
    • logger.error("메시지"): ERROR 레벨 메시지 기록

2. 주요 로깅 레벨과 사용 예시

  • TRACE: 가장 상세한 레벨로, 주로 성능 측정, 데이터 흐름 확인 시 사용됩니다.
  • DEBUG: 디버깅을 위한 로그로, 개발 시 주로 사용되며 세부적인 실행 정보를 기록합니다.
  • INFO: 애플리케이션의 일반적인 상태와 주요 이벤트를 기록합니다.
  • WARN: 경고성 메시지로, 큰 문제는 아니지만 주의가 필요한 상태를 나타냅니다.
  • ERROR: 오류가 발생했을 때 기록하며, 애플리케이션 실행에 문제를 발생시키는 경우에 사용됩니다.

예시

logger.trace("세부 추적 로그 메시지");
logger.debug("디버깅 정보: {}", someVariable);
logger.info("서비스가 정상적으로 시작되었습니다.");
logger.warn("경고: 예상치 않은 동작이 감지되었습니다.");
logger.error("오류 발생: 예외 메시지", exception);

3. Logger 메시지 포맷팅

Logger는 성능을 고려하여 메시지 포맷팅을 지연 평가합니다. 즉, 로그 레벨에 따라 메시지가 출력되지 않으면 포맷팅을 수행하지 않습니다. {} 플레이스홀더를 사용하여 메시지 내 변수 값을 대체할 수 있습니다.

String username = "홍길동";
logger.info("사용자 {}가 로그인했습니다.", username);
  • 출력: 사용자 홍길동가 로그인했습니다.

4. Logger의 레벨 설정 (application.properties)

스프링 부트에서는 application.properties 파일에서 로거의 기본 레벨을 설정할 수 있습니다. 특정 패키지 또는 전체 애플리케이션에 대해 로깅 레벨을 지정할 수 있습니다.

# 전체 애플리케이션에 대한 기본 로그 레벨
logging.level.root=WARN

# 특정 패키지에 대해 다른 로그 레벨 설정
logging.level.com.example=DEBUG
logging.level.org.springframework.web=INFO

0개의 댓글