개요
현재 사용 가능한 자바 로깅 프레임워크는 다양한 종류가 있습니다. JUL(java.util.logging), JCL(Jakarta Commons Logging), Jboss-logging, Log4j, Log4j2, Logback, SLF4J 등이 그 예시입니다.
| 로깅门面 (추상층) | 로깅 구현체 |
|---|---|
| SLF4J (Simple Logging Facade for Java) | Logback |
| JCL (Jakarta Commons Logging) | Log4j |
| Jboss-logging | JUL |
| Log4j2 |
왼쪽 열에서门面(추상층)을 선택하고, 오른쪽 열에서 구현체를 선택하여 사용합니다. Spring Boot에서는 SLF4J를门面로, Logback을 구현체로 선택합니다.
참고: Spring 프레임워크의 기본 로깅 구현은 JCL이지만, Spring Boot에서는 SLF4J와 Logback을 사용합니다.
SLF4J 사용 방법
1. SLF4J 통합
시스템에서 로깅을 사용할 때는 직접 구현체를 호출하지 않고, 추상층의 API를 사용해야 합니다. SLF4J 추상 라이브러리와 Logback 구현 라이브러리를 프로젝트에 의존성으로 추가하면 됩니다.
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Application {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(Application.class);
logger.info("애플리케이션 시작");
}
}
각 로깅 구현 프레임워크는 고유한 설정 파일 형식을 가집니다. SLF4J를使用时에도 설정 파일은 실제 구현 프레임워크의 형식을 따릅니다.
2. 기존 로깅 프레임워크 문제 해결
여러 프레임워크(Spring, Hibernate, MyBatis 등)를 함께 사용할 때, 각 프레임워크가 서로 다른 로깅 라이브러리를 사용할 수 있습니다. 모든 로그를 SLF4J로 통일하려면 다음 단계를 따르세요:
- 기존 로깅 프레임워크 제거: 다른 로깅 라이브러리를 제외합니다.
- 중간 변환 패키지 사용: 기존 로깅을 SLF4J로 전환하는 어댑터를 추가합니다.
- SLF4J 구현체導入: 최종적으로 사용할 SLF4J 구현체를 의존성에 추가합니다.
Spring Boot 로깅 의존성 구조
Spring Boot의 기본 스타터는 다음 로깅 의존성을 포함합니다:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
이 의존성은 내부적으로 다음을 포함합니다:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
의존성 트리를 확인하면 Spring Boot가 SLF4J와 Logback을 사용하는 것을 볼 수 있습니다.
핵심 포인트:
- Spring Boot는 내부적으로 SLF4J + Logback方式进行日志记录
- 다른 로깅 프레임워크도 모두 SLF4J로 자동 변환
- 변환을 위해 Slf4JLogFactory가 사용됨
다른 프레임워크를 추가할 때는 해당 프레임워크의 기본 로깅 의존성을 제거해야 합니다. 예를 들어, Spring 프레임워크는 commons-logging을 사용하므로:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
Spring Boot는 모든 로깅 프레임워크를 자동으로 adapter하고,底层는 SLF4J + Logback을 사용합니다. 새 프레임워크를 추가할 때 해당 프레임워크의 로그 의존성만 제외하면 됩니다.
로깅 사용법
기본 설정
Spring Boot는 기본 로깅 구성을 자동으로 설정합니다.
// 로거 생성
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void testLogging() {
// 로그 레벨 순서: trace < debug < info < warn < error
// 설정된 레벨 이상만 출력됨
logger.trace("추적 로그...");
logger.debug("디버그 로그...");
logger.info("정보 로그...");
logger.warn("경고 로그...");
logger.error("오류 로그...");
}
기본 로그 출력 형식:
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
%d: 날짜 및 시간%thread: 스레드 이름%-5level: 레벨 표시(5자리)%logger{50}: 로거 이름(최대 50자)%msg: 로그 메시지%n: 줄바꿈
기본 설정 수정
# 특정 패키지의 로그 레벨 설정
logging.level.com.example=trace
# 로그 파일 경로 설정 (절대 경로 가능)
logging.file.path=/var/log/application
# 로그 파일 이름 설정
logging.file.name=application.log
# 콘솔 출력 형식
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 파일 출력 형식
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
| logging.file | logging.path | 설명 |
|---|---|---|
| 지정 안 함 | 지정 안 함 | 콘솔에만 출력 |
| 파일명 지정 | 지정 안 함 | 지정된 파일에 출력 |
| 지정 안 함 | 디렉토리 지정 | 지정 디렉토리에 spring.log로 출력 |
사용자 정의 설정
클래스패스에 각 로깅 프레임워크의 설정 파일을 배치하면 기본 설정을 덮어쓸 수 있습니다.
| 로깅 시스템 | 설정 파일 |
|---|---|
| Logback | logback-spring.xml, logback-spring.groovy, logback.xml |
| Log4j2 | log4j2-spring.xml, log4j2.xml |
| JDK Logging | logging.properties |
logback.xml은 로깅 프레임워크가 직접 인식하지만, logback-spring.xml은 Spring Boot가 해석하므로 Spring Profile 기능을 활용할 수 있습니다.
<springProfile name="development">
<!-- development 환경에서만 활성화 -->
</springProfile>
실제 사용 예:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<springProfile name="dev">
<pattern>%d{HH:mm:ss.SSS} [DEV] %-5level %logger{36} - %msg%n</pattern>
</springProfile>
<springProfile name="prod">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [PROD] %-5level %logger{50} - %msg%n</pattern>
</springProfile>
</layout>
</appender>
주의: logback.xml을 사용하면서 springProfile을 사용하면 오류가 발생합니다. 반드시 logback-spring.xml을 사용해야 합니다.
로깅 프레임워크 전환
Log4j로 전환
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>logback-classic</artifactId>
<groupId>ch.qos.logback</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
Log4j2로 전환
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>