跳到主要内容
版本:7.0.2

日志通道适配器

DeepSeek V3 中英对照 Logging Channel Adapter

<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>
  • 连接日志适配器与上游组件的通道。

  • 发送到此适配器的消息将被记录的日志级别。默认值: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);

}

}