코드 한 줄의 기록

Java 로깅 완벽 가이드: SLF4J와 로그 레벨 이해 본문

JAVA

Java 로깅 완벽 가이드: SLF4J와 로그 레벨 이해

CodeByJin 2025. 10. 19. 08:23
반응형

Java 애플리케이션 개발에서 로깅(Logging)은 코드 실행 흐름을 이해하고 문제를 분석하는 데 필수적인 도구입니다.
본 글에서는 가장 널리 쓰이는 로깅 추상화 라이브러리인 SLF4J(Simple Logging Facade for Java)와 로깅 레벨(Leveling)의 개념을 정리하고, 실전 예제와 설정 팁까지 다룹니다.

로깅이 왜 필요한가?

애플리케이션 실행 중 발생하는 이벤트를 기록하는 로깅은 다음과 같은 장점을 제공합니다.

  • 문제 발생 시 원인 파악디버깅 시간 단축
  • 운영 환경에서의 실제 동작 정보 수집
  • 사용자 행동, 성능 로그 등으로 모니터링애널리틱스 지원
“System.out.println()” 로깅은 간단하지만, 생산 환경에서 남용 시 성능 저하와 로그 관리의 어려움을 초래합니다.

SLF4J란 무엇인가?

SLF4J는 다양한 로깅 구현체(Logback, Log4j2 등)에 대한 추상화 계층(Facade)을 제공합니다.
장점

  • 구체적 로깅 라이브러리 교체 시 코드 수정 최소화
  • 다양한 로깅 구현체와 호환

구성 요소

  • org.slf4j.LoggerFactory : 로거 인스턴스 생성
  • org.slf4j.Logger : 실제 로깅 API 제공
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
    private static final Logger logger = LoggerFactory.getLogger(MyApp.class);

    public static void main(String[] args) {
        logger.info("애플리케이션 시작");
        logger.debug("디버깅 정보: args={}", Arrays.toString(args));
        try {
            // 비즈니스 로직 수행
        } catch (Exception e) {
            logger.error("에러 발생: {}", e.getMessage(), e);
        }
    }
}

로깅 레벨(Level) 이해하기

로거는 다양한 중요도(Severity) 수준으로 메시지를 남깁니다.
각 레벨은 우선순위가 있으며, 보통 다음 순서로 설정합니다.

레벨(Level) 설명 사용 사례
ERROR 심각한 오류로 정상 흐름 중단 우려 예외 처리, 시스템 치명적 오류
WARN 경고로 주의 필요 자원 부족, 레거시 호출
INFO 정보로 일반적 상태 출력 서비스 시작/종료, 주요 이벤트
DEBUG 디버깅용 상세 정보 변수 상태, 알고리즘 수행 단계
TRACE 추적용 가장 상세 정보 메서드 진입/종료, 루프 반복

 

실제 운영에서는 보통 INFO 이상을 남기고, 개발 환경에서는 DEBUGTRACE를 활용합니다.

SLF4J와 구현체 연동

SLF4J는 추상화만 제공하므로 구현체를 함께 추가해야 합니다.

 

Maven 의존성 예시 (Logback 사용)

<dependencies>
    <!-- SLF4J API -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.0</version>
    </dependency>
    <!-- Logback Classic 구현체 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.4.0</version>
    </dependency>
</dependencies>

 

logback.xml 기본 설정

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

    <!-- 패키지별 로깅 레벨 설정 -->
    <logger name="com.myapp.service" level="DEBUG"/>
</configuration>

로깅 활용 팁

  • 포맷팅 : SLF4J의 {} 플레이스홀더를 적극 활용해 문자열 결합 비용을 줄이세요.
    logger.debug("결과값: x={}, y={}", x, y);
  • 예외 로깅 : 예외 스택트레이스를 로그에 남길 때는 마지막 인자로 Throwable을 전달합니다.
    logger.error("처리 중 예외 발생", e);
  • 로깅 컨텍스트(MDC) : Mapped Diagnostic Context를 사용해 스레드별 추가 정보를 자동 삽입할 수 있습니다.
    MDC.put("userId", userId);
    logger.info("사용자 작업 수행");
    MDC.clear();
        
  • 프로파일별 설정 분리 : logback-spring.xml 등 환경에 따라 설정 파일을 분리해 개발/운영 로깅 정책을 분리하세요.

실제 운영 시 고려 사항

  • 로그 출력 비용 : DEBUG 레벨이 많은 경우 I/O 병목 우려.
  • 로그 보관 정책 : 용량 관리 및 검색 효율을 위해 로테이션, 압축 설정을 적용.
  • 로그 수집 및 분석 : ELK, Splunk, Grafana Loki 등으로 중앙집중식 수집 및 대시보드 구성.

Java 로깅은 단순 출력이 아니라 운영 안정성문제 해결 속도를 좌우하는 핵심 요소입니다.
학습 과정을 단계별로 정리하면 다음과 같습니다.

  1. SLF4J API 사용해 기본 로깅 구현
  2. Logback, Log4j2 같은 구현체 설정 파일 이해
  3. 로깅 레벨(Level)의 의미와 환경별 레벨링 전략 수립
  4. MDC, 필터(Filter), Appender 등 고급 기능 학습
  5. 로그 수집·분석 시스템 연동 및 모니터링 대시보드 구축

차근차근 로깅의 기초부터 고급 활용까지 익히면, 개발 생산성과 운영 안정성이 한층 높아집니다.
이 글이 로깅 학습 여정에 도움이 되길 바랍니다.

 

 

Java 스택 트레이스와 브레이크포인트 완벽 해설

소프트웨어 개발 과정에서 예외(Exception)와 버그(Bug)는 피할 수 없는 과제입니다. 특히 Java 개발자는 스택 트레이스(Stack Trace)를 통해 예외 발생 위치와 원인을 파악하고, IDE 디버거(Debugger)의 브레

byteandbit.tistory.com

 

반응형