日志通道适配器
<logging-channel-adapter>
通常与线程探针结合使用,如 线探针 中所讨论。
然而,它也可以用作任何流程的最终消费者。
例如,考虑一个以 <service-activator>
结束并返回结果的流程,但您希望丢弃该结果。
为此,您可以将结果发送到 NullChannel
。
或者,您可以将其路由到 INFO
级别的 <logging-channel-adapter>
。
这样,当以 INFO
级别记录时,您可以看到被丢弃的消息,但在以(例如)WARN
级别记录时则看不到。
使用 NullChannel
,您只有在以 DEBUG
级别记录时才能看到被丢弃的消息。
以下列表显示了 logging-channel-adapter
元素的所有可能属性:
<int:logging-channel-adapter
channel="" [id="CO1-1"]1
level="INFO" [id="CO1-2"]2
expression="" [id="CO1-3"]3
log-full-message="false" [id="CO1-4"]4
logger-name="" /> [id="CO1-5"]5
<1> 将日志适配器连接到上游组件的通道。 <1> 发送到此适配器的消息将被记录的日志级别。 默认值:`INFO`。 <1> 一个 SpEL 表达式,精确表示消息的哪些部分被记录。 默认值:`payload` — 仅记录 payload。 如果指定了 `log-full-message`,则不能指定此属性。 <1> 当为 `true` 时,记录整个消息(包括头部)。 默认值:`false` — 仅记录 payload。 如果指定了 `expression`,则不能指定此属性。 <1> 指定记录器的 `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);
}
}