add slf4j examples
This commit is contained in:
182
slf4j/README.md
Normal file
182
slf4j/README.md
Normal file
@@ -0,0 +1,182 @@
|
||||
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
|
||||
<dependencies>
|
||||
<!-- Slf4j API -->
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>2.0.12</version> <!-- 최신 버전 확인 필요 -->
|
||||
</dependency>
|
||||
<!-- Logback (Slf4j의 기본 구현체) -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>1.5.3</version> <!-- 최신 버전 확인 필요 -->
|
||||
</dependency>
|
||||
</dependencies>
|
||||
```
|
||||
|
||||
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
|
||||
<configuration>
|
||||
<appender name="CONSOLE" 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="CONSOLE" />
|
||||
</root>
|
||||
</configuration>
|
||||
```
|
||||
- 위 설정은 콘솔에 로그를 출력하며, 로그 레벨은 `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
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-slf4j-impl</artifactId>
|
||||
<version>2.23.1</version> <!-- 최신 버전 확인 필요 -->
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.logging.log4j</groupId>
|
||||
<artifactId>log4j-core</artifactId>
|
||||
<version>2.23.1</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
2. **Log4j 설정 파일 추가**
|
||||
`log4j2.xml` 파일을 `src/main/resources`에 추가합니다:
|
||||
```xml
|
||||
<Configuration status="WARN">
|
||||
<Appenders>
|
||||
<Console name="Console" target="SYSTEM_OUT">
|
||||
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
|
||||
</Console>
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Root level="info">
|
||||
<AppenderRef ref="Console"/>
|
||||
</Root>
|
||||
</Loggers>
|
||||
</Configuration>
|
||||
```
|
||||
|
||||
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 인터페이스를 직접 구현할 수 있지만 유지보수와 성능을 고려해 기존 구현체를 사용하는 것이 낫습니다.
|
||||
|
||||
추가 질문이 있으면 언제든 물어보세요!
|
||||
Reference in New Issue
Block a user