본문 바로가기

개발일지

Logback에서 Log Level를 처리하는 과정

Logback 사용

회사뿐만 아니라 사이드 프로젝트에서도 로그를 관리하기 위해 Logback을 사용하고 있다. 의존성 추가하고 logback.xml를 작성함으로 간단히 설정하고 사용할 수 있었다. 사용하는 데에 불편함이 없었고 원하는 대로 동작하기 때문에 아키텍처 구성과 내부 로직에 대해서 별도로 찾아보지 않게 되었다.

 

이번에 구현한 동작이 외부 API와 연결에 문제가 발생해서 예외가 발생을 했다. 그런데 예외에 대한 간략한 정보만 로그에 남았고 필요한 로그들은 INFO 레벨로 설정이 되어있어 남지 않았다. Logback에 ERROR 레벨로 설정이 되어있었기 때문이다. API로 정확히 어떤 데이터를 보냈고 어떤 에러가 발생했는지를 파악하기 위해 로그 ERROR로 모두 출력이 되도록 변경을 했다.

 

단순하게 Trace < Debug < Info < Warn < Error 순으로 예외 레벨만 잘 입력해 주는 것이었는데, 어떻게 레벨에 따라 하위 레벨만 출력해 줄 수 있는지 궁금해졌다. 이번 기회에 내부 로직을 간단하게 확인해 보기로 했다.

Logback 레벨 비교

logback은 현재 로그를 입력하는 레벨을 필터와 로그를 입력하는 메서드로 전달을 한다. 전달한 메서드에서는 TurboFilter에서 먼저 처리를 하고 NEUTRAL 상태값인 경우에 레벨 체크를 하고 있었다.

레벨이 Logback에 설정한 레벨보다 값이 낮은 경우 로그를 Appender에 추가를 하지 않고 메서드를 종료해버린다. 이와 같이 출력할 로그와 아닌 것을 레벨 단위에서 체크를 한다. 

 

private void filterAndLog_0_Or3Plus(final String localFQCN, final Marker marker, final Level level,
        final String msg, final Object[] params, final Throwable t) {

    final FilterReply decision = loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg,
            params, t);

    if (decision == FilterReply.NEUTRAL) {
        if (effectiveLevelInt > level.levelInt) {
            return;
        }
    } else if (decision == FilterReply.DENY) {
        return;
    }

    buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t);
}

 

레벨은 Level 클래스에 정의가 되어있고, 상수 값이 할당되어 있다. 우리가 흔히 사용하는 것처럼 Trace < Debug < Info < Warn < Error 순서대로 큰 값을 가지고 있는 것을 알 수 있다.

 

public final class Level implements java.io.Serializable {
    public static final int ERROR_INT = 40000;
    public static final int WARN_INT = 30000;
    public static final int INFO_INT = 20000;
    public static final int DEBUG_INT = 10000;
    public static final int TRACE_INT = 5000;
}

 

그 이외에 Logger 전체 아키텍처와 TurboFilter 및 Appender 등을 더 찾아보기는 했지만 전체적으로 이해하는 데에는 시간이 더 필요하다고 생각이 들었다. 시간이 되거나 TurboFilter처럼 사용해야 하는 상황이 온다면 더 알아봐야겠다. 

앞으로 조금씩이라도 무심코 사용하던 것들에 대해 구조를 알아가려고 노력하는 시간을 가져보자

'개발일지' 카테고리의 다른 글