Slf4j(Simple Logging Facade for Java)는 자바 애플리케이션에서 로깅을 위한 표준 인터페이스를 제공하는 라이브러리입니다. Slf4j와 호환되는 로거를 만드는 방법은 크게 두 가지로 나눌 수 있습니다: 1) Slf4j를 직접 사용하는 방법, 2) Slf4j를 기존 로깅 프레임워크와 연결하는 방법입니다. 아래에서 단계별로 설명하겠습니다.
---
### 1. Slf4j 직접 사용하기 (기본 설정)
Slf4j는 자체적으로 로깅 구현체를 제공하지 않으므로, Slf4j API와 함께 실제 로깅을 처리할 백엔드(예: Logback, Log4j 등)를 설정해야 합니다. 가장 일반적인 방법은 **Logback**과 함께 사용하는 것입니다.
#### 단계별 설정:
1. **의존성 추가 (Maven 사용 예시)**
`pom.xml`에 Slf4j와 Logback 의존성을 추가합니다:
```xml
org.slf4j
slf4j-api
2.0.12
ch.qos.logback
logback-classic
1.5.3
```
2. **로거 인스턴스 생성**
코드에서 Slf4j의 `Logger`와 `LoggerFactory`를 사용해 로거를 생성합니다:
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
public void doSomething() {
logger.debug("디버그 메시지");
logger.info("정보 메시지");
logger.warn("경고 메시지");
logger.error("에러 메시지");
}
}
```
3. **Logback 설정 파일 추가 (선택)**
기본적으로 Logback은 설정 없이도 동작하지만, 로그 출력 형식이나 레벨을 커스터마이징하려면 `src/main/resources` 디렉토리에 `logback.xml` 파일을 추가합니다:
```xml
%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n
```
- 위 설정은 콘솔에 로그를 출력하며, 로그 레벨은 `INFO` 이상으로 설정합니다.
4. **실행 확인**
`doSomething()` 메서드를 호출하면 로그가 콘솔에 출력됩니다:
```
2025-03-01 12:00:00 INFO [main] com.example.MyClass - 정보 메시지
2025-03-01 12:00:00 WARN [main] com.example.MyClass - 경고 메시지
2025-03-01 12:00:00 ERROR [main] com.example.MyClass - 에러 메시지
```
---
### 2. 기존 로깅 프레임워크와 Slf4j 연결하기
만약 프로젝트에서 Log4j, JUL(java.util.logging) 등 다른 로깅 프레임워크를 이미 사용 중이라면, Slf4j를 브릿지(bridge)로 활용해 통합할 수 있습니다.
#### Log4j와 연결 예시:
1. **의존성 추가**
Log4j를 Slf4j에 연결하려면 `log4j-slf4j-impl`을 추가합니다:
```xml
org.apache.logging.log4j
log4j-slf4j-impl
2.23.1
org.apache.logging.log4j
log4j-core
2.23.1
```
2. **Log4j 설정 파일 추가**
`log4j2.xml` 파일을 `src/main/resources`에 추가합니다:
```xml
```
3. **코드에서 Slf4j 사용**
Log4j가 백엔드로 동작하더라도, 코드에서는 여전히 Slf4j API를 사용합니다:
```java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyClass {
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
public void doSomething() {
logger.info("Log4j를 통한 정보 메시지");
}
}
```
---
### 3. 커스텀 로거 구현 (직접 만드는 경우)
Slf4j와 완전히 독립적인 커스텀 로거를 만들고 싶다면, Slf4j의 `ILoggerFactory`와 `Logger` 인터페이스를 구현할 수 있습니다. 하지만 이 방법은 복잡하므로, 일반적으로는 Logback이나 Log4j 같은 기존 구현체를 사용하는 것이 권장됩니다.
#### 간단한 커스텀 로거 예시:
1. `Logger` 인터페이스 구현:
```java
import org.slf4j.Logger;
public class CustomLogger implements Logger {
private final String name;
public CustomLogger(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public boolean isInfoEnabled() {
return true;
}
@Override
public void info(String msg) {
System.out.println("[INFO] " + name + " - " + msg);
}
// 나머지 메서드 (debug, warn, error 등) 구현 생략
}
```
2. `ILoggerFactory` 구현:
```java
import org.slf4j.ILoggerFactory;
public class CustomLoggerFactory implements ILoggerFactory {
@Override
public Logger getLogger(String name) {
return new CustomLogger(name);
}
}
```
3. Slf4j에 커스텀 로거 연결:
Slf4j는 기본적으로 클래스패스에서 첫 번째로 발견된 구현체를 사용하므로, 위 구현체를 빌드 경로에 포함시키고 다른 구현체(Logback, Log4j 등)를 제거하면 됩니다.
---
### 결론
- **추천 방법**: Slf4j + Logback 조합을 사용하는 것이 가장 간단하고 널리 사용됩니다.
- **기존 시스템 통합**: Log4j나 JUL을 사용 중이라면 브릿지 모듈을 활용하세요.
- **커스텀 필요 시**: Slf4j 인터페이스를 직접 구현할 수 있지만 유지보수와 성능을 고려해 기존 구현체를 사용하는 것이 낫습니다.
추가 질문이 있으면 언제든 물어보세요!