|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
日志通道适配器
<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 | 指定日志记录器的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);
}
}