feign capabilities not support multiple feign.Logger Logger · Issue #2794 · OpenFeign/feign · GitHub
Skip to content

feign capabilities not support multiple feign.Logger Logger #2794

Open

Description

@ipanocloud
feign.client.config.default.capabilities[0]=com.google.ACapability
feign.client.config.default.capabilities[1]=com.google.BCapability

this config.
code detail demo:

public class ACapability implements Capability {
   @Override
    public Logger enrich(Logger logger) {
        return new ALogger(logger);
    }
}

public class BCapability implements Capability {
    @Override
    public Logger enrich(CustomLogger logger) { 
        return new BLogger(logger);
    }
}

public class ALogger extends feign.Logger {

   @Override
    protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) {
         // todo print message
    }
}

public class BLogger extends feign.Logger {

   @Override
    protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime) {
         // todo print message
    }
}

The only thing that will be effective is com.google.BCapability

Activity

  1. changed the title [-]feign capabilities not support mulit Logger[/-] [+]feign capabilities not support multiple feign.Logger Logger[/+] on Feb 27, 2025
  2. hosuaby commented on Mar 25, 2025

    @hosuaby
    Contributor

    @ipanocloud This probably Spring Feign problem.

    I wrote the following test and enrichment works as expected:

      @Test
      void multipleCapabilitiesEnrichment() {
        Feign.Builder builder =
            Feign.builder()
                .logger(new Logger.JavaLogger(BaseBuilderTest.class))
                .addCapability(new ACapability())
                .addCapability(new BCapability())
                .enrich();
    
        assertThat(builder.logger).isInstanceOf(BLogger.class);
        assertThat(((BLogger) builder.logger).delegate).isInstanceOf(ALogger.class);
        assertThat(((ALogger) ((BLogger) builder.logger).delegate).delegate)
            .isInstanceOf(Logger.JavaLogger.class);
      }
    
      public class ACapability implements Capability {
        @Override
        public Logger enrich(Logger logger) {
          return new ALogger(logger);
        }
      }
    
      public class BCapability implements Capability {
        @Override
        public Logger enrich(Logger logger) {
          return new BLogger(logger);
        }
      }
    
      public class ALogger extends feign.Logger {
        Logger delegate;
    
        ALogger(Logger logger) {
          this.delegate = logger;
        }
    
        @Override
        protected void log(final String configKey, final String format, final Object... args) {
          // DO NOTHING
        }
      }
    
      public class BLogger extends feign.Logger {
        Logger delegate;
    
        BLogger(Logger logger) {
          this.delegate = logger;
        }
    
        @Override
        protected void log(final String configKey, final String format, final Object... args) {
          // DO NOTHING
        }
      }
  3. added
    questionGeneral usage or 'how-to' questions
    on Jun 4, 2026
  4. velo commented on Jun 4, 2026

    @velo
    Member

    Thanks for the report. This project is community-maintained, and the maintainer will not implement fixes or features directly. If you want this to move forward, please open a pull request with automated tests that cover the change.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionGeneral usage or 'how-to' questions

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions