日誌通道介面卡

<logging-channel-adapter> 通常與線執行緒探測器(wire tap)結合使用,正如 線執行緒探測器 中討論的那樣。但是,它也可以用作任何流程的最終消費者。例如,考慮一個流程以返回結果的 <service-activator> 結束,但您希望丟棄該結果。為此,您可以將結果傳送到 NullChannel。或者,您可以將其路由到一個 INFO 級別的 <logging-channel-adapter>。這樣,當日志級別為 INFO 時,您可以看到被丟棄的訊息,但在日誌級別為 WARN (例如) 時則看不到。使用 NullChannel,您只有在日誌級別為 DEBUG 時才能看到被丟棄的訊息。以下列表顯示了 logging-channel-adapter 元素的所有可能屬性

<int:logging-channel-adapter
    channel="" (1)
    level="INFO" (2)
    expression="" (3)
    log-full-message="false" (4)
    logger-name="" /> (5)
1 將日誌介面卡連線到上游元件的通道。
2 傳送到此介面卡的訊息將被記錄的日誌級別。預設值:INFO
3 表示訊息中哪些部分將被精確記錄的 SpEL 表示式。預設值:payload — 僅記錄載荷。如果指定了 log-full-message,則不能指定此屬性。
4 當為 true 時,記錄整條訊息(包括訊息頭)。預設值:false — 僅記錄載荷。如果指定了 expression,則不能指定此屬性。
5 指定日誌記錄器(在 log4j 中稱為 category)的 name。用於標識此介面卡建立的日誌訊息。這使得可以為單個介面卡設定日誌名稱(在日誌子系統中)。預設情況下,所有介面卡都在以下名稱下記錄日誌:org.springframework.integration.handler.LoggingHandler

使用 Java 配置

以下 Spring Boot 應用展示了使用 Java 配置 LoggingHandler 的示例

@SpringBootApplication
public class LoggingJavaApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context =
             new SpringApplicationBuilder(LoggingJavaApplication.class)
                    .web(false)
                    .run(args);
         MyGateway gateway = context.getBean(MyGateway.class);
         gateway.sendToLogger("foo");
    }

    @Bean
    @ServiceActivator(inputChannel = "logChannel")
    public LoggingHandler logging() {
        LoggingHandler adapter = new LoggingHandler(LoggingHandler.Level.DEBUG);
        adapter.setLoggerName("TEST_LOGGER");
        adapter.setLogExpressionString("headers.id + ': ' + payload");
        return adapter;
    }

    @MessagingGateway(defaultRequestChannel = "logChannel")
    public interface MyGateway {

        void sendToLogger(String data);

    }

}

使用 Java DSL 配置

以下 Spring Boot 應用展示了使用 Java DSL 配置日誌通道介面卡的示例

@SpringBootApplication
public class LoggingJavaApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context =
             new SpringApplicationBuilder(LoggingJavaApplication.class)
                    .web(false)
                    .run(args);
         MyGateway gateway = context.getBean(MyGateway.class);
         gateway.sendToLogger("foo");
    }

    @Bean
    public IntegrationFlow loggingFlow() {
        return IntegrationFlow.from(MyGateway.class)
                     .log(LoggingHandler.Level.DEBUG, "TEST_LOGGER",
                           m -> m.getHeaders().getId() + ": " + m.getPayload());
    }

    @MessagingGateway
    public interface MyGateway {

        void sendToLogger(String data);

    }

}