Spring/문법

Spring Boot Logger 사용법 – SLF4J & Logback

가지코딩 2025. 5. 23. 11:58

Spring Boot에서는 System.out.println() 대신 Logger를 사용한다.

 

처음에는 println이 더 직관적이고 간편하게 느껴질 수 있지만, 실제 서비스 운영 환경에서는 다음과 같은 요구 사항이 생긴다:

  • 로그 중요도 구분 (DEBUG, INFO, ERROR 등)
  • 로그 파일 저장 및 관리
  • 다양한 환경별 로그 수준 조절
  • 멀티스레드 환경에서도 안정적 동작
  • 일관된 포맷, 성능 최적화

이를 위해 Spring Boot는 기본적으로 SLF4J(Simple Logging Facade for Java) + Logback 조합을 내장하여 제공한다.
이 글에서는 왜 Logger를 사용해야 하는지, 어떻게 사용하는지, 그리고 실전에서 어떻게 설정하고 활용할 수 있는지 정리한다.


1. System.out.println()의 한계

한계 설명
❌ 로그 레벨 없음 출력의 중요도 구분 불가
❌ 파일 저장 불가 운영 환경에서 로그 추적 어려움
❌ 포맷 제어 어려움 일관성 없는 출력
❌ 조건부 출력 불가 모든 로그가 항상 출력됨
❌ 성능 문제 대량 출력 시 성능 저하 가능

2. Logger의 장점

  • 로그 레벨별로 출력 제어 가능 (TRACE ~ ERROR)
  • 파일, 콘솔, 네트워크 등 다양한 출력 대상 지정 가능
  • 환경에 따라 다른 로그 설정 가능 (ex. dev vs prod)
  • 포맷 지정, 필터링, async logging 가능
  • 성능 최적화: DEBUG 로그 비활성화 시 실행 자체를 생략

3. Logger 사용법

Lombok의 @Slf4j 사용

  • 로그 선언을 직접 할 필요 없이, log 객체가 자동 생성된다.
import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestController
public class UserController {

    @GetMapping("/hello")
    public String hello() {
        log.info("Hello 요청됨");
        return "Hello";
    }
}

 

 

수동 선언 (Lombok 없이)

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyService {
    private static final Logger log = LoggerFactory.getLogger(MyService.class);

    public void execute() {
        log.debug("실행됨");
    }
}

 

 

* 개념 정리

용어 설명
SLF4J 로그 API 인터페이스 (Simple Logging Facade for Java)
Logback Spring Boot 기본 내장 로그 구현체
Logger 로그 출력을 담당하는 객체

 

* 로그 레벨 종류

레벨 용도
trace 가장 상세한 로그 (디버깅 초반)
debug 개발 시 디버깅용
info 운영 시 정상 흐름 기록
warn 문제는 아니지만 주의할 상황
error 예외, 에러 발생 시

4. 로그 설정 방법 (application.properties)

# 전역 로그 레벨 설정
logging.level.root=info

# 특정 패키지 로그 수준 설정
logging.level.com.example.demo=debug

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

5. 실전 팁

"문자열 결합" 대신 "{}" 형식 사용

log.info("사용자: {}", username); // 권장
log.info("사용자: " + username); // 비권장

 

 

DEBUG 로그는 운영 환경에서 꺼두기

spring.profiles.active=prod
logging.level.root=info

 

 

로그 포맷 커스터마이징 가능 (예: 시간, 클래스명 등 표시)