| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- JVM
- 파이썬
- Java
- 멀티스레드
- 알고리즘공부
- 코딩테스트팁
- 자바기초
- 클린코드
- 자바개발
- 프로그래밍기초
- 코딩테스트준비
- 프로그래머스
- 알고리즘
- 개발자취업
- 예외처리
- 메모리관리
- 자바공부
- 정렬
- 코딩공부
- 개발자팁
- 자료구조
- 자바프로그래밍
- 코딩인터뷰
- 백준
- 객체지향
- 개발공부
- 자바
- 코딩테스트
- HashMap
- 가비지컬렉션
- Today
- Total
코드 한 줄의 기록
Java 로깅 완벽 가이드: SLF4J와 로그 레벨 이해 본문
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 이상을 남기고, 개발 환경에서는 DEBUG나 TRACE를 활용합니다.
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 로깅은 단순 출력이 아니라 운영 안정성과 문제 해결 속도를 좌우하는 핵심 요소입니다.
학습 과정을 단계별로 정리하면 다음과 같습니다.
- SLF4J API 사용해 기본 로깅 구현
- Logback, Log4j2 같은 구현체 설정 파일 이해
- 로깅 레벨(Level)의 의미와 환경별 레벨링 전략 수립
- MDC, 필터(Filter), Appender 등 고급 기능 학습
- 로그 수집·분석 시스템 연동 및 모니터링 대시보드 구축
차근차근 로깅의 기초부터 고급 활용까지 익히면, 개발 생산성과 운영 안정성이 한층 높아집니다.
이 글이 로깅 학습 여정에 도움이 되길 바랍니다.
Java 스택 트레이스와 브레이크포인트 완벽 해설
소프트웨어 개발 과정에서 예외(Exception)와 버그(Bug)는 피할 수 없는 과제입니다. 특히 Java 개발자는 스택 트레이스(Stack Trace)를 통해 예외 발생 위치와 원인을 파악하고, IDE 디버거(Debugger)의 브레
byteandbit.tistory.com
'JAVA' 카테고리의 다른 글
| ArrayList vs LinkedList 언제 어떤 걸 써야 할까? (0) | 2025.10.25 |
|---|---|
| Java 컬렉션 프레임워크 이해하기: List/Set/Map 완벽 가이드 (0) | 2025.10.24 |
| Java 스택 트레이스와 브레이크포인트 완벽 해설 (0) | 2025.10.18 |
| Java 사용자 정의 예외와 예외 전환·포장 전략 완벽 가이드: 실전 예제와 베스트 프랙티스 (0) | 2025.10.16 |
| Java try-catch-finally와 try-with-resources로 자원 누수 완벽 방지하기 (0) | 2025.10.15 |