Logging Channel Adapter
通常将 <logging-channel-adapter>`与讨论于 Wire Tap中的备用源一起使用。但是,它也可被用作任意流的最终使用者。例如,考虑一个以返回结果的 `<service-activator>`结尾的流,但您希望放弃该结果。为此,您可以将结果发送到 `NullChannel
。或者,您可以将它路由至 <logging-channel-adapter>`级别的 `INFO
。如此一来,在 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 - 只记录 payload。如果指定了 log-full-message ,则无法指定此属性。 |
4 | 当为 true 时,记录整个消息(包括头)。默认值: false - 只记录 payload。如果指定了 expression ,则无法指定此属性。 |
5 | 指定记录器的 name (在 log4j 中称为 category )。用于标识此适配器创建的日志消息。这能让为各个适配器设置日志名称(在日志记录子系统中)。默认情况下,所有适配器在以下名称下记录日志: org.springframework.integration.handler.LoggingHandler 。 |
Using Java Configuration
以下 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);
}
}
Configuring with the 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);
}
}