如何测试 Spring 启动应用程序的日志?

How can I test logs of Spring Boot application?

我有一个混合了 Spring Boot、Jersey 和 Camel 应用程序的应用程序。它作为 Spring 启动应用程序启动。我在写集成测试,我需要在日志上做断言?

例如,我需要断言 Camel 路由从源 A 读取了一条消息。我怎样才能对日志做出可靠的断言?这有什么行业标准吗?

注意:我尝试寻找任何解决方案,但目前,我既不知道如何解决也找不到现成的解决方案。

更新 1: 我低估的细节,但它似乎很重要。我使用 Kotlin,而不是 Java。我尝试应用 answer,但它不能一对一地转移到 Kotlin

更新 2:

这是从 JavaKotlin 的转换。 ListAppender 没有足够的信息来解析 Kotlin 中的类型。

class LoggerExtension : BeforeEachCallback, AfterEachCallback {
    private val listAppender: ListAppender<ILoggingEvent> = ListAppender<ILoggingEvent>()
    private val logger: Logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME) as Logger

    override fun afterEach(extensionContext: ExtensionContext) {
        listAppender.stop()
        listAppender.list.clear()
        logger.detachAppender(listAppender)
    }

    override fun beforeEach(extensionContext: ExtensionContext) {
        logger.addAppender(listAppender)
        listAppender.start()
    }

    val messages: List<String>
        get() = listAppender.list.stream().map { e -> e.getMessage() }.collect(Collectors.toList())
    val formattedMessages: List<String>
        get() = listAppender.list.stream().map { e -> e.getFormattedMessage() }.collect(Collectors.toList())
}

Kotlin: Not enough information to infer type variable A

不是错误,但我感觉它会在运行时失败:

private val logger: Logger = LoggerFactory.getLogger(ROOT_LOGGER_NAME) as Logger

Spring Boot 附带了 JUnit 5 的 OutputCapture rule for JUnit 4 and OutputCaptureExtension,让您可以断言发送到标准输出的文本。

public class MyTest {

     @Rule
     public OutputCaptureRule output = new OutputCaptureRule();

     @Test
     public void test() {
         // test code
         assertThat(output).contains("ok");
     }

 }