본문 바로가기

SW 개발 이야기

Log4j 실시간 로그 레벨 변경하기 (Code Analyst 코드 이야기 #1)

지난번에 오픈소스로 공개한 Code Analyst에 대해 잠깐 소개한 적이 있다.

2020/10/28 - [SW 개발 이야기] - Code Analyst(코드분석) 오픈소스SW 개발 이야기

그리고 특징적인 부분을 정리하기로 했는데, 첫번째로 간단하게 Log4j에 대한 로그 레벨을 실시간으로 변경할 때 사용할 수 있는 코드를 소개한다.

로깅은 보통 SLF4J(Simple Logging Facade for Java)를 앞에 두고 실제 구현체만 log4j를 많이 사용하지만, Code Analyst에는 log4j를 그대로 사용했으며, 다음과 같은 처리를 통해 쉽게 원하는 로거의 레벨을 실시간으로 변경을 할 수 있다.

package com.samsungsds.analyst.code.util;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;

public class LogUtils {
    public static void unsetDebugLevel() {
        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration conf = ctx.getConfiguration();
        conf.getLoggerConfig("com.samsungsds.analyst.code").setLevel(Level.INFO);
        conf.getLoggerConfig("org.sonar").setLevel(Level.INFO);
        ctx.updateLoggers(conf);
    }

    public static void setDebugLevel() {
        LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
        Configuration conf = ctx.getConfiguration();
        conf.getLoggerConfig("com.samsungsds.analyst.code").setLevel(Level.DEBUG);
        conf.getLoggerConfig("org.sonar").setLevel(Level.DEBUG);
        ctx.updateLoggers(conf);
    }
}

이를 활용하면, 평소 INFO 수준으로 서비스를 하다가 DEBUG로 레벨을 변경 후, 서비스를 재기동하없이 자세한 디버깅 로그를 확인할 수 있다.

참고로 SLF4J는 실시간으로 레벨을 변경할 수 없다. 어찌보면 SLF4J 역할 상 당연한 것 같다.

Written with by Vincent Han