Files
2025-03-03 19:32:18 +09:00
..
2025-03-03 19:32:18 +09:00
2025-03-03 19:32:18 +09:00
2025-03-03 19:32:18 +09:00

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 의존성을 추가합니다:

    <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의 LoggerLoggerFactory를 사용해 로거를 생성합니다:

    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 파일을 추가합니다:

    <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을 추가합니다:

    <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에 추가합니다:

    <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를 사용합니다:

    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의 ILoggerFactoryLogger 인터페이스를 구현할 수 있습니다. 하지만 이 방법은 복잡하므로, 일반적으로는 Logback이나 Log4j 같은 기존 구현체를 사용하는 것이 권장됩니다.

간단한 커스텀 로거 예시:

  1. Logger 인터페이스 구현:

    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 구현:

    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 인터페이스를 직접 구현할 수 있지만 유지보수와 성능을 고려해 기존 구현체를 사용하는 것이 낫습니다.

추가 질문이 있으면 언제든 물어보세요!