Spring Boot

[Spring Boot] 스프링 로깅 방법 (SLF4J, Logback)

공대생안씨 2024. 9. 15. 16:41

1. 로깅 (logging)

  • 애플리케이션의 동작, 오류, 이벤트 등을 기록하는 과정
  • 로깅으로 작성된 로그를 통해 개발자가 애플리케이션의 상태를 모니터링하고 문제 진단, 성능 분석 가능
  • 주요 목적 : 오류 해결, 보안 감사, 성능 개선 등

 

1-1. 로그 기록 장소

  • 콘솔
  • 파일
  • 이메일/문자 (SMTP/SMS)
  • DB

 

1-2. 로깅 레벨

  • 패키지나 클래스 별로 로그에 남길 정보의 정도 설정 가능
  • (스프링 부트의 로그 프레임워크인 LogBack 의 로그 레벨) TRACE < DEBUG < INFO < WARN < ERROR
    • 좌측일수록 상세한 수준 (다음 레벨의 내용 모두 포함) / 우측일수록 중요한 수준
      • ex) DEBUG 로그 : INFO, WARN, ERROR 로그를 모두 포함
    • TRACE : 개발 단계에서 사용, DEBUG 레벨보다 상세한 수준의 로그 출력
    • DEBUG : 개발 단계에서 사용, 디버깅 가능한 상세한 수준의 로그 출력
    • INFO : 로그에 저장하고 싶은 중요 애플리케이션 이벤트 (운영에 참고되는 정보 등)
    • WARN : 상황에 따라 위험해질 수 있는 정보 (예외 처리 등)
    • ERROR : 즉시 대응해야 할 에러 레벨 로그 ⇒ 미대응 시 심각한 장애 발생 가능!

 

2. 스프링 부트 로깅

2-1. SLF4J

  • SLF4J : Simple Logging Facade for Java
  • 자바 애플리케이션에서 로깅을 위한 추상화 계층을 제공하는 라이브러리
    ⇒ 로깅 구현체에 대한 의존성을 줄여줌!
  • 다양한 로깅 프레임워크 (Log4j, Logback, JDK logging 등) 와의 호환성 유지, 로깅 관리가 쉬움
    ⇒ SLF4J의 간단한 api 통해서 로그 작성함 / 실제 로깅 작업은 로깅 프레임워크가 처리함!

 

2-2. Logback

  • Java 기반 로깅 프레임워크
  • SLF4J의 구현체 중 하나 (SLF4J api 로 로그 작성 → Logback이 실제 로깅 작업 처리!)
  • 프로젝트에 springboot-web 의존성이 추가되어 있다면 기본적으로 logback 프레임워크 사용 가능

 

2-3. 로깅 방법

2-3-0. spring-boot-starter-web 의존성 추가

  • build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}

 

2-3-1. 로거 인스턴스 수동 생성

private Logger log = LoggerFactory.getLogger(Log.class);

 

2-3-2. 로거 인스턴스 자동 생성 (@Slf4j 어노테이션)

  • build.gradle
    • 롬복 의존성 추가
dependencies {
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

 

  • 클래스 레벨에 @Slf4j 어노테이션 추가
@Slf4j
public class LoggingService {
		
    // 로거 인스턴스 생성 코드 자동 생성
}

 

2-3-3. 로그 출력

log.error("error message = default error level message"); // error 레벨 로그
log.warn("warn message = default warn level message");  // warn 레벨 로그
log.info("info message = default info level message");  // info 레벨 로그
log.debug("debug message = default debug level message");  // debug 레벨 로그
log.trace("trace message = default trace level message");  // trace 레벨 로그
  • 위의 코드를 실행해보면 info 레벨 로그까지만 출력될 것임
    • Logback 프레임워크의 기본 로그 레벨은 info 이므로 error, warn, info 까지만 출력됨

 

3. 로깅 설정

  • application.yml에서 Logback의 로깅 설정 방법
  • logback-spring.xml 생성해서 Logback의 로깅 설정 방법

 

3-1. application.yml 에서 설정

3-1-1. 로그 레벨 설정

logging:
  level:
    root: INFO  # 애플리케이션의 기본 로그 레벨 설정
    com.example: DEBUG  # 특정 패키지의 로그 레벨 설정
    com.example.LoggingService: TRACE  # 특정 클래스의 로그 레벨 설정

 

3-1-2. 파일에 로그 기록 설정

logging:
  file:
    name: example_log/myApp.log  # 로그가 기록될 파일 설정

 

3-1-3. 로그 패턴 설정

logging:
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n"  # 콘솔 출력 패턴 설정
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"  # 파일 출력 패턴 설정
  • 콘솔에 출력된 로그 예시

  • 파일에 출력된 로그 예시

⇒ 콘솔과 파일 각각 다른 로그 패턴 적용함을 확인!

 

3-2. logback-spring.xml 에서 설정

3-2-1. 기본 logback-spring.xml

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 로그 패턴 설정 -->
            <pattern>
                로그 패턴 설정 : %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- 전역 로그 레벨 설정 -->
    <root level="debug">
        <!-- 콘솔 출력 설정 -->
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
  • 실행결과

 

3-2-2. 파일에 로그 기록 설정

<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 로그 파일 이름 설정 -->
        <file>./log_by_logback-spring/myApp.log</file>
        <encoder>
            <!-- 로그 패턴 설정 -->
            <pattern>
                파일 로그 패턴 설정 : %d{yyyy-MM-dd} [%thread] %-5level %logger{10} [%file:%line] -%kvp- %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- 전역 로그 레벨 설정 -->
    <root level="debug">
        <!-- 파일 출력 설정 -->
        <appender-ref ref="FILE"/>
    </root>
</configuration>
  • 실행결과