JUL to SLF4J Bridge

1. 소개

JUL은 자바의 내장 로깅 프레임워크입니다. 사용하기 간단하지만 현대적인 대안이 제공하는 유연성과 고급 기능이 부족합니다. 이러한 이유로 많은 애플리케이션은 다른 것을 선택합니다.

하지만 모듈식 소프트웨어와 서드파티 의존성이 있는 세계에서, 우리의 애플리케이션에서 JUL을 사용할 수밖에 없는 상황이 발생할 수 있습니다. 이로 인해 로그를 올바르게 구성하는 것이 더 복잡해집니다.

이 문서에서는 SLF4J의 JUL-대-SLF4J 브리지가 이 문제를 해결하는 데 도움이 되는 방법을 살펴보겠습니다.

2. 의존성

먼저, 프로젝트에 SLF4J 의존성을 추가합니다. Maven 프로젝트의 경우, slf4j-apijul-to-slf4j 의존성을 pom.xml 파일에 추가해야 합니다:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>2.0.16</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>2.0.16</version>
</dependency>

jul-to-slf4j 아티팩트는 모든 수신 JUL 기록을 SLF4J API로 라우팅하는 java.util.logging (JUL) 핸들러인 SLF4JBridgeHandler로 구성됩니다.

애플리케이션은 사용할 SLF4J API SLF4J 로깅 구현도 지정해야 합니다. 따라서 이 문서에서는 애플리케이션이 slf4j-simple을 사용한다고 가정합니다:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>2.0.16</version>
</dependency>

3. 기본 JUL 로그

브리지를 구성하기 전에 라이브러리가 JUL을 통해 로그를 남기면 기본 JUL 형식을 사용하여 출력됩니다. 예를 들어 다음 코드를 고려해 보겠습니다:

import java.util.logging.Logger;
public class BusinessLogic {

    static void julLog(Logger julLogger) {
        julLogger.info("This is a JUL info log message!");
        julLogger.warning("This is a JUL warning log message!");
    }
}

JUL-to-SLF4J 브리지를 사용하지 않고 이 코드를 실행하면, julLog()는 다음과 유사한 출력을 생성합니다:

Jan 19, 2025 11:43:41 PM com.baeldung.BusinessLogic julLog INFO: This is a JUL info log message!
Jan 19, 2025 11:43:41 PM com.baeldung.BusinessLogic julLog WARNING: This is a JUL warning log message!

4. 브리지 구성

브리지를 구성하는 방법은 두 가지입니다: 프로그래밍 방식 또는 logging.properties 파일을 통한 구성입니다. 각 방법을 살펴보겠습니다.

4.1. 프로그래밍 방식 구성

SLF4J 브리지를 메인 애플리케이션 클래스에서 프로그래밍 방식으로 설정할 수 있습니다. 이 방법은 간단하며 브리지가 애플리케이션 초기화 단계에서 설치되도록 보장합니다:

import org.slf4j.bridge.SLF4JBridgeHandler;
import java.util.logging.Logger;

public static void main(String[] args) {
    // 기존 핸들러 제거
    SLF4JBridgeHandler.removeHandlersForRootLogger();

    // SLF4J 브리지 설치
    SLF4JBridgeHandler.install();

    // SLF4J 브리가 설치된 후 출력 테스트
    BusinessLogic.julLog(julLogger);
    BusinessLogic.slf4jLog(logger);
}

이 코드에서는 먼저 기존 JUL 핸들러를 제거하여 중복 로그 항목을 방지한 후, SLF4J 브리지를 설치하여 모든 JUL 로그 기록을 SLF4J로 리다이렉션합니다.

4.2. logging.properties로 구성

또는 JUL의 logging.properties 파일을 사용하여 브리지를 선언적으로 구성할 수 있습니다. 이 방법은 코드베이스를 수정하거나 프로그래밍 방식의 구성을 추가하는 것이 어려운 애플리케이션에 적합합니다.

이렇게 하려면 먼저 src/main/resources/logging.properties를 생성하고 JUL 핸들러와 로깅 수준을 지정합니다:

handlers = org.slf4j.bridge.SLF4JBridgeHandler
.level = INFO

이 구성에서:

  • handlers 라인은 SLF4JBridgeHandler가 JUL 루트 로거에 대한 로깅을 처리하도록 합니다.
  • level 속성은 기본 로깅 수준을 INFO로 설정합니다. 즉, 이 수준 이상의 메시지만 로그로 기록됩니다.

JUL은 기본적으로 JAVA_HOME/conf 디렉토리의 logging.properties 파일을 사용합니다. 사용자 정의 구성이 사용되도록 하려면 애플리케이션을 실행할 때 logging.properties 파일의 위치를 명시적으로 지정해야 합니다. 이는 JVM 인수를 사용하여 수행할 수 있습니다:

-Djava.util.logging.config.file=/path/to/logging.properties

이렇게 하면 기본 설정 대신 사용자 정의 로깅 구성이 로드됩니다.

이 방법은 괜찮지만, 우리가 일부 JUL 내부를 관리해야 한다는 단점이 있습니다. 프로그래밍 방식 접근법은 SLF4J API를 사용하여 구성할 수 있게 해줍니다.

5. 로깅 구성 테스트

이제 JUL-to-SLF4J 브리지를 설정했으므로, 모든 것이 예상대로 작동하는지 로그 구성을 테스트할 수 있습니다.

5.1. JUL을 통한 로깅

서드파티 라이브러리가 JUL을 사용하여 로그를 기록하더라도 로그 메시지는 이제 SLF4J를 통해 라우팅됩니다:

import java.util.logging.Logger;

public class BusinessLogic {
    static void julLog(Logger julLogger) {
        julLogger.info("This is a JUL info log message!");
        julLogger.warning("This is a JUL warning log message!");
    }
}

이제 이러한 로그는 SLF4J 백엔드(예: slf4j-simple)에서 처리되며 julLog()의 출력은 다음과 유사합니다:

[main] INFO com.baeldung.JULAppWithProgrammaticSLF4J - This is a JUL info log message!
[main] WARN com.baeldung.JULAppWithProgrammaticSLF4J - This is a JUL warning log message!

5.2. SLF4J를 통한 직접 로깅

이전 섹션에서는 JUL과 함께 SLF4J를 사용할 수 있음을 보여주었으나, SLF4J 로거를 선언하는 것이 더 좋습니다:

public class BusinessLogic {
    static void slf4jLog(org.slf4j.Logger logger) {
        logger.info("This is an SLF4J info log message!");
        logger.error("This is an SLF4J error log message!");
    }
}

JUL 기반과 SLF4J 기반 로깅 모두 테스트하여 통합이 올바르게 작동하는지 확인할 수 있습니다.

6. 결론

JUL-to-SLF4J 브리지는 JUL과의 호환성을 유지하면서 로깅 기능을 향상시킵니다. SLF4J를 통합함으로써 강력한 로깅 API와 유연성을 얻을 수 있습니다. 이 브리지는 로깅 관행을 개선하고 유지 관리성을 보장하려는 개발자에게 귀중한 추가 요소입니다. 사용 가능한 코드는 여기 GitHub에서 확인할 수 있습니다.

원본 출처

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다