검증을 위한 Logback 로그 출력 테스트 방법

로그 출력을 검증하는 것은 테스트 코드 작성 시 중요한 부분입니다. 특히, 로그 레벨에 따른 조건적인 출력을 검증할 때는 정확성이 요구됩니다. 이 문서는 Logback 라이브러리를 사용하여 로그 출력을 효과적으로 검사하는 방법을 설명합니다.

Appender란?

Appender는 Logback의 핵심 구성 요소로 로그 이벤트를 기록하는 역할을 합니다. 공식 문서에 따르면:

Logback은 로깅 이벤트를 작성하는 작업을 'appender'라고 불리는 컴포넌트에 위임합니다. Appender는 ch.qos.logback.core.Appender 인터페이스를 구현해야 합니다. - Logback 공식 문서

기본적으로, 스프링 부트에는 콘솔에 로그 이벤트를 출력하는 콘솔 Appender가 포함되어 있습니다.

로그 검사를 위한 사용자 정의 Appender 구현

로그 출력을 검사하기 위해서는 사용자 정의 Appender와 RecordCheckable 인터페이스를 구현해야 합니다. Logback 라이브러리는 리스트 형태로 이벤트를 기록하는 ListAppender를 제공합니다. 아래는 ListAppender를 확장하고 RecordCheckable 인터페이스를 구현한 예시 코드입니다.

ListAppender

import java.util.ArrayList;  
import java.util.List;  
import ch.qos.logback.core.AppenderBase;  

public class ListAppender<E> extends AppenderBase<E> {  
    public List<E> list = new ArrayList<E>();  

    protected void append(E e) {  
        list.add(e);  
    }  
}

RecordCheckable 인터페이스와 RecordCheckAppender 구현

import ch.qos.logback.classic.Level;  
import ch.qos.logback.classic.Logger;  
import ch.qos.logback.classic.spi.ILoggingEvent;  
import ch.qos.logback.core.read.ListAppender;  

interface RecordCheckable {  
    boolean isRecord(String message, Level level);  
}  

public class RecordCheckAppender extends ListAppender<ILoggingEvent> implements RecordCheckable {  
    public static RecordCheckAppender addAppender(Logger logger) {  
        RecordCheckAppender newAppender = new RecordCheckAppender();  
        logger.addAppender(newAppender);  
        newAppender.start();  
        return newAppender;  
    }  

    @Override  
    public boolean isRecord(String message, Level level) {  
        return this.list.stream()  
            .filter(iLoggingEvent -> iLoggingEvent.getLevel().equals(level))  
            .anyMatch(iLoggingEvent -> iLoggingEvent.getMessage().contains(message));  
    }  
}

테스트 코드에서의 사용

테스트를 진행하기 전에 테스트 대상 클래스의 Logger에 RecordCheckAppender를 추가합니다.

@BeforeEach  
void beforeEach() {  
    this.recordCheckAppender =  
        RecordCheckAppender.addAppender((Logger) LoggerFactory.getLogger(Foo.class));  
}

이제 아래와 같이 로그 레벨과 메시지를 통해 로그의 출력 여부를 검증할 수 있습니다.

@Test  
public void testAlertUnspecifiedAuthError() {  
    Foo foo = new Foo();
    foo.log();
    assertTrue(recordCheckAppender.isRecord("foo log가 출력되었습니다.", Level.WARN));  
}

위의 방법을 통해 로그 출력의 정확성을 테스트 코드 내에서 쉽고 명확하게 검증할 수 있습니다.

+ Recent posts