Spring 集成 DSL:在 AbstractMessageHandler 中禁用双重 DEBUG 日志记录

Spring Integration DSL: Disable double DEBUG logging in AbstractMessageHandler

我正在使用 Spring Integration DSL 中的 .log() 函数,我想在 DEBUG 级别创建一个日志。这是一个例子:

...
.<DataDTO>log(LoggingHandler.Level.DEBUG, "Http Input Flow V2",          
              message -> {
                 DataDTO dto = message.getPayload();
                 return "Input data: " + dto.toString;
              })
...

这有效,但是,创建了两条日志消息:实际的日志消息 Input data: ... 和来自 AbstractMessageHandler:

的一条
@Override
public void handleMessage(Message<?> message) {
    ...
    if (this.loggingEnabled && this.logger.isDebugEnabled()) {
        this.logger.debug(this + " received message: " + message);
    }
    ...
 }

AbstractMessageHandler中,this.loggingEnabled默认设置为true

是否可以在 AbstractMessageHandler 中禁用日志记录但保留自定义日志消息?我尝试将 application.ymlAbstractMessageHandler 的日志记录级别设置为 ERROR,但这没有帮助。

我认为您的日志记录配置中有类似 org.springframework.integration=DEBUG 甚至 org.springframework=DEBUG 的内容。

文字 "Http Input Flow V2" 对于类别来说有点尴尬:

   /**
     * Populate a {@link WireTap} for the {@link #currentMessageChannel}
     * with the {@link LoggingHandler} subscriber for the provided
     * {@link LoggingHandler.Level} logging level, logging category
     * and {@link Function} for the log message.
     * @param level the {@link LoggingHandler.Level}.
     * @param category the logging category.
     * @param function the function to evaluate logger message at runtime
     * @param <P> the expected payload type.
     * against the request {@link Message}.
     * @return the current {@link IntegrationFlowDefinition}.
     * @see #wireTap(WireTapSpec)
     */
    public <P> B log(LoggingHandler.Level level, String category, Function<Message<P>, Object> function) {

另外,loggingEnabled 可以被 @EnableIntegrationManagement 及其:

禁用
/**
 * Use to disable all logging in the main message flow in framework components. When 'false', such logging will be
 * skipped, regardless of logging level. When 'true', the logging is controlled as normal by the logging
 * subsystem log level configuration.
 * <p>
 * It has been found that in high-volume messaging environments, calls to methods such as
 * {@code logger.isDebuggingEnabled()} can be quite expensive and account for an inordinate amount of CPU
 * time.
 * <p>
 * Set this to false to disable logging by default in all framework components that implement
 * {@link IntegrationManagement} (channels, message handlers etc). This turns off logging such as
 * "PreSend on channel", "Received message" etc.
 * <p>
 * After the context is initialized, individual components can have their setting changed by invoking
 * {@link IntegrationManagement#setLoggingEnabled(boolean)}.
 * @return the value; true by default.
 */
String defaultLoggingEnabled() default "true";

falsehttps://docs.spring.io/spring-integration/docs/5.0.0.RELEASE/reference/html/system-management-chapter.html#_configuring_metrics_capture