日志记录通道适配器
<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);
}
}