日志通道适配器
<logging-channel-adapter> 组件通常与线路窃听器一起使用,如在 线路窃听器 中所讨论的。但是,它也可以作为任何流程的最终消费者来使用。例如,考虑一个以 <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>
- 将日志适配器连接到上游组件的通道。 
- 发送到此适配器的消息将被记录的日志级别。默认值: - INFO。
- 一个 SpEL 表达式,表示消息的哪些部分将被记录。默认值: - payload—— 仅记录有效负载。如果指定了- log-full-message,则不能指定此属性。
- 当值为 - true时,整个消息(包括标题)将被记录。默认值:- false—— 仅记录有效负载。如果指定了- expression,则不能指定此属性。
- 指定日志记录器的 - name(在- log4j中称为- category)。用于识别由该适配器创建的日志消息。这使得可以为各个适配器设置日志名称(在日志记录子系统中)。默认情况下,所有适配器都以以下名称进行日志记录:- 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);
    }
}