[java] Java Jersey에서 로깅 레벨을 동적으로 변경하는 방법은?

Java Jersey는 웹 애플리케이션 개발을 위한 프레임워크로, 로깅은 애플리케이션 개발에서 중요한 역할을 합니다. 로깅 레벨을 동적으로 변경하는 방법에 대해 알아보겠습니다.

1. logback.xml 설정 파일 변경

로그 레벨을 동적으로 변경하려면 logback.xml 설정 파일을 수정해야 합니다. logback.xml 파일은 주로 src/main/resources 디렉토리에 위치해 있습니다.

logback.xml 파일을 열고, 해당 애플리케이션에서 사용하는 로그 레벨을 변경하고자 하는 패키지에 대한 Logger를 설정합니다. 아래와 같이 패키지에 대한 로그 레벨을 설정해줍니다.

<logger name="com.example.package" level="DEBUG" />

위의 예시에서는 “com.example.package” 패키지에 대한 로그 레벨을 DEBUG로 설정한 것입니다. 이렇게 설정하면 해당 패키지에 대한 로그 메시지가 DEBUG 레벨로 출력됩니다.

2. 동적으로 로깅 레벨 변경

Java Jersey에서는 RESTful 서비스의 엔드포인트를 통해 로깅 레벨을 동적으로 변경할 수 있습니다. 이를 위해 다음과 같은 컨트롤러 메서드를 작성합니다.

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;

@Path("/logLevel")
public class LogLevelController {

    @Inject
    LoggerContext loggerContext;

    @GET
    public String setLogLevel(@QueryParam("package") String packageName, @QueryParam("level") String logLevel) {

        Logger logger = (Logger) LoggerFactory.getLogger(packageName);

        Level level = Level.toLevel(logLevel);

        if (logger != null && level != null) {
            logger.setLevel(level);
            loggerContext.getLoggerList().forEach(l -> { if (l.getName().startsWith(packageName)) l.setLevel(level); });
            return "Successfully set log level for package " + packageName + " to " + logLevel;
        } else {
            return "Failed to set log level for package " + packageName + " to " + logLevel
        }
    }
}

위의 코드는 “logLevel” 엔드포인트로 요청을 받아 패키지 이름과 로그 레벨을 파라미터로 받아 해당 패키지의 로그 레벨을 동적으로 변경합니다. 로그 레벨 변경에 성공할 경우에는 “Successfully set log level for package {packageName} to {logLevel}” 메시지를 반환합니다.

3. 동적 로그 레벨 변경 확인

로그 레벨을 변경하는 최종 단계로, 아래와 같이 curl 명령어를 사용하여 “logLevel” 엔드포인트에 요청을 보냅니다. 이를 통해 로깅 레벨이 동적으로 변경되는지 확인할 수 있습니다.

curl -X GET "http://localhost:8080/logLevel?package=com.example.package&level=DEBUG"

위의 예시에서는 “com.example.package” 패키지에 대한 로그 레벨을 DEBUG로 변경하는 것을 요청하는 것입니다.

이제 Java Jersey에서 로깅 레벨을 동적으로 변경하는 방법에 대해 알게 되었습니다. 이렇게 하면 로그 레벨을 프로그램을 재시작하지 않고도 실시간으로 조정할 수 있어 개발과 디버깅에 용이합니다.

자세한 내용은 logback 공식 문서를 참조하시기 바랍니다.