애플리케이션의 상태를 추적하고 문제를 진단하기 위해 로깅(logging)은 필수입니다. Spring Boot에서는 기본적으로 SLF4J + Logback 조합이 기본 설정으로 제공되며, 개발과 운영 환경 모두에서 널리 사용됩니다.
1. SLF4J란?
SLF4J(Simple Logging Facade for Java)는 다양한 로깅 프레임워크에 대한 통합 인터페이스(Facade)입니다.
- Log4j, Logback, java.util.logging 등과 쉽게 연동 가능
- 코드 레벨에서는 SLF4J API만 사용하면 로깅 구현체는 유연하게 교체 가능
즉, SLF4J는 로깅 API 표준을 제공하고, Logback은 실제 로깅을 수행하는 구현체입니다.
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.info("정보 로그 출력");
logger.error("에러 발생", e);
2. Logback이란?
Logback은 SLF4J의 공식 구현체로, Spring Boot에서 기본으로 사용됩니다. 다음과 같은 특징이 있습니다.
- 성능이 우수하고, 비동기 로그 처리 지원
- XML 기반의 유연한 설정 방식
- 로그 레벨별 출력, 파일 분리, 압축 및 보관 기능 지원
기본 설정 없이도 Spring Boot는 Logback을 자동 구성하지만, 직접 설정이 필요할 경우 logback-spring.xml을 사용합니다.
3. 기본 로그 설정
Spring Boot에서 별도 설정이 없을 경우 다음 기본 설정이 적용됩니다.
- 콘솔(console)에 INFO 레벨 이상 로그 출력
- 로깅 포맷:
yyyy-MM-dd HH:mm:ss.level.loggerName - message
로그 레벨은 application.properties
또는 application.yml
에서 설정할 수 있습니다.
# application.properties 예시
logging.level.root=INFO
logging.level.com.myapp=DEBUG
# application.yml 예시
logging:
level:
root: INFO
com.myapp: DEBUG
4. logback-spring.xml 커스터마이징
logback-spring.xml 파일을 src/main/resources
에 추가하면 로깅을 세밀하게 설정할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="LOG_PATH" value="logs"/>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/app.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>14</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
- RollingFileAppender: 날짜별 로그 분리
- maxHistory: 로그 보관 일수
필요 시 콘솔과 파일을 동시에 출력할 수도 있습니다. (appender 두 개 등록)
5. 로깅 레벨 정리
레벨 | 설명 | 사용 예 |
---|---|---|
TRACE | 가장 상세한 디버깅 정보 | 루프 내부 변수 추적 |
DEBUG | 디버깅에 유용한 정보 | 서비스 흐름, 파라미터 로그 |
INFO | 정상 흐름의 상태 정보 | API 호출 성공, 처리 결과 |
WARN | 잠재적 문제, 경고 | deprecated 사용, 예외 fallback |
ERROR | 실패한 처리 또는 예외 | try-catch 예외 처리 |
운영환경에서는 INFO 또는 WARN 이상만 출력하고, 개발환경에서는 DEBUG 레벨을 적극 사용하는 것을 권장합니다.
6. 실무에서의 로깅 전략
- 중요한 흐름:
INFO
로그로 추적 가능하도록 - 민감한 정보(ex. 비밀번호, 카드번호)는 절대 로그에 남기지 않기
- 운영 서버에서는 외부 로깅 시스템과 연동 (예: ELK, CloudWatch, Datadog)
- 로깅에는
PlaceHolder 방식
사용 권장 (logger.debug("userId: {}", id)
)
결론
Spring Boot에서는 SLF4J + Logback 기반의 로깅 설정이 매우 강력하면서도 유연합니다. 간단한 설정만으로 콘솔, 파일, 외부 연동까지 다양한 로깅 전략을 구사할 수 있으며, 환경별 프로파일 설정과 연계해 개발/운영 구분도 쉽게 구현할 수 있습니다.
정확하고 효율적인 로그는 개발자에게 강력한 무기입니다. 실제 운영에서 발생하는 장애나 이슈의 근본 원인을 빠르게 파악하려면, 설계 단계에서부터 로깅 전략을 고민 하는 것이 중요합니다.
'개발 > JAVA' 카테고리의 다른 글
JUnit5와 Spring Test 기초: 단위 테스트부터 통합 테스트까지 (0) | 2025.09.27 |
---|---|
Spring Boot에서 @Value를 사용해 properties 값 주입하기 (0) | 2025.09.26 |
Spring Boot DevTools 활용하기 – 개발 생산성을 높이는 자동 리로드 기능 (0) | 2025.09.24 |
@Configuration과 @Bean의 차이 – Spring 개발자라면 반드시 짚고 가야 할 핵심 개념 (0) | 2025.09.23 |
Spring Profile로 환경별 설정 관리하기 – 개발자라면 꼭 알아야 할 환경 분리 전략 (0) | 2025.09.22 |