【问题标题】:Feign logging not working假装日志不起作用
【发布时间】:2017-08-02 17:44:40
【问题描述】:

我正在尝试让来自 Feign 休息客户端的每个请求的日志记录工作。但是我无法让日志记录工作,而“标准”Slf4j 日志记录确实有效。

我有以下几点:

public MyClient() {
        initConnectionProperties();

        this.service = Feign.builder()
                .contract(new JAXRSContract())
                .decoder(getJacksonDecoder())
                .encoder(getJacksonEncoder())


                .requestInterceptor(new BasicAuthRequestInterceptor(user, password))
                //.client(new OkHttpClient())
                .logger(new Slf4jLogger(MyClient.class)) //not working

                .logLevel(feign.Logger.Level.BASIC)
                .target(MyClient.class, this.url);
        logger.info("Connection parameters: url = " + url + ", user = " + user); //Is working
    }

【问题讨论】:

  • 您是否有任何 SLF4J 的配置文件可能会忽略 MyClient 类的日志?
  • 在我的 Spring Boot 应用中,Feign 的日志记录在 application.yml 中配置为 logging.level.com.mycompany.admintool.external.persons.resource.CustomerResource: DEBUG
  • 我在这里遇到了同样的问题。你找到解决办法了吗?

标签: java feign


【解决方案1】:

您需要在 application.properties 中配置日志记录,如下所示:

logging.level.<package path>.MyClient=DEBUG

如果您使用的是 application.yml,那么:

logging.level.<package path>.MyClient: DEBUG

可以设置日志级别来告诉 Feign 记录多少。

选项是:

  • 无,无日志记录(默认)
  • BASIC,仅记录请求方法和 URL 以及响应状态码和执行时间
  • HEADERS,记录基本信息以及请求和响应标头
  • FULL,记录请求和响应的标头、正文和元数据

例子:

logLevel(feign.Logger.Level.NONE)
or
logLevel(feign.Logger.Level.BASIC)
or
logLevel(feign.Logger.Level.HEADERS)
or
logLevel(feign.Logger.Level.FULL)

更多详情可以参考this

【讨论】:

【解决方案2】:

这就是我使用自定义配置类登录的方式

注意 Feign logging 只响应 DEBUG 级别。

配置类

@Configuration
public class UserClientConfig {

    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.HEADERS;
    }
} 

客户

@FeignClient(name = "User", url = "http://localhost:8080",configuration=UserClientConfig.class)
public interface UserClient {

    @RequestMapping(method = RequestMethod.GET, value = "/user")
    List<User> getAllUsers();    

}

应用程序属性

logging.level.<pcakgepath>.UserClient: DEBUG

【讨论】:

    【解决方案3】:

    首先,您需要将 feign 客户端类的日志记录级别设置为 DEBUG,正如 Maverick 在他的回答中已经提到的那样。

    然后,如果您使用 Spring Boot,除了 Niraj 在他的回答中已经提到的创建 @Configuration 类的选项之外,您可以在应用程序属性/yml 配置文件中单独配置每个客户端:

    feign: client: config: the_name_of_your_feign_client: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic

    或者使用 default 而不是 the_name_of_your_feign_client 以相同的方式配置所有 feign 客户端:

    feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic

    【讨论】:

    • 按照这个答案,我设法提高日志记录级别,将这些行添加到我的 application.properties:feign.client.config.&lt;fiegn-client-name or default&gt;.loggerLevel=fulllogging.level.&lt;package&gt;.&lt;feign-client-interface&gt;=DEBUG
    • 重要说明,其中名称为@FeignClient(name = "fiegn-client-name")参数的值
    【解决方案4】:

    我没有设置客户端,我的客户端调用失败,并且日志记录不起作用..一旦我添加 OkHttpClient 并更改 logback.xml 文件,工作正常

        MyApi myApi = Feign.builder()
                .client(new OkHttpClient())
                .decoder(new JacksonDecoder())
                .encoder(new JacksonEncoder())
                .logger(new Slf4jLogger())
                .logLevel(feign.Logger.Level.FULL)
                .target(MyApi.class, "http://localhost:8082");
    

    这是 logback.xml

    <configuration>
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>%d %green([%thread]) %highlight(%level) %logger{50} - %msg%n</pattern>
            </encoder>
        </appender>
        <logger name="feign.Logger" level="DEBUG" />
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
        </root>
    </configuration>
    

    【讨论】:

      【解决方案5】:

      您可能还需要将 feign 的 log4j 日志记录级别配置为 DEBUG。如果您使用的是弹簧靴,那么对我有用的是:

      curl -X POST http://localhost/loggers/feign -H 'Content-Type: application/json' -d '{"configuredLevel": "DEBUG"}'
      

      【讨论】:

        【解决方案6】:
        private void setup() {
            //...
            feignBuilder.logger(new MyLogger());
            feignBuilder.logLevel(Logger.Level.FULL);
        }
        
        private static class MyLogger extends Logger {
            @Override
            protected void log(String s, String s1, Object... objects) {
                System.out.println(String.format(s + s1, objects)); // Change me!
            }
        }
        

        【讨论】:

        • 仅供参考:这对我有用。我正在使用 logback,但在我的单元测试中没有得到任何输出。我有feignBuilder.logLevel(Logger.Level.FULL),但没有指定记录器。添加feignBuilder.logger(new Slf4JLogger()); 然后我得到输出。
        • 谢谢!最后一个答案不会让我陷入另一个兔子洞,让我看看发生了什么而无需进一步搜索。我对现代软件开发的抱怨之一是我们在无尽的层上添加了无尽的层。仅配置调试就会导致您遇到几个潜在的兔子洞:“好的,我在哪里放那个文件”和“好的,我在哪里可以找到那个库”,以及“好的,我应该为没有人指定的那个对象导入哪个类进口”。或者“好的,我在哪里添加那个注释”。这个例子简单、完整、容易。
        【解决方案7】:

        以下代码更改在 kotlin 中对我有用:

        import feign.Logger
        import org.springframework.context.annotation.Bean
        import org.springframework.context.annotation.Configuration
        
        @Configuration
        class FeignLoggingConfiguration {
        
            @Bean
            fun feignLoggerLevel(): Logger.Level {
                return Logger.Level.HEADERS
            }
        }
        

        在客户端添加这个配置类:

        @FeignClient(name = "yourClient", url = "\${base-url}", configuration = [FeignLoggingConfiguration::class])
        interface yourClient 
        
        

        注意:请确保 yourClient 类的日志记录级别为 DEBUG

        feign 支持的登录级别:

        无,不记录(默认)

        BASIC,仅记录请求方法和 URL 以及响应状态码和执行时间

        HEADERS,记录基本信息以及请求和响应标头

        FULL,记录请求和响应的标头、正文和元数据

        【讨论】:

          【解决方案8】:

          我有点晚了,但让我试着帮助其他人找到这个帖子。

          我们必须区分两件事。使用普通 Feign 以及与 Spring Cloud OpenFeign 一起使用时的 Feign 日志记录。

          使用简单的 Feign,你必须做一些事情才能使事情正常进行:

          1. 您必须为您的客户端设置日志级别
          2. 您必须配置您选择的相应日志适配器
          3. 您必须将feign 记录器设置为DEBUG

          让我告诉你怎么做:

          Feign.builder()
               .logLevel(Logger.Level.FULL)
               .logger(new Slf4jLogger())
               .target(MyClient.class, "http://localhost:8081");
          

          在这种特殊情况下,我使用 SLF4J 作为日志适配器。此配置处理了第 1 步和第 2 步。 现在让我们配置记录器。别忘了,这可能会因您的日志记录设置而异,我将向您展示一个使用 Spring Boot 的设置:

          application.properties:

          logging.level.feign=DEBUG
          

          但这可以通过您的logback.xml、log4j 中的普通 Logback 来完成,无论您拥有什么日志系统。唯一重要的是将feign命名记录器配置为DEBUG

          这是因为 Feign 库使用 feign 记录器而不是目标客户端的类名来记录所有内容。

          使用 Spring Cloud OpenFeign,它会发生一些变化,因为 Spring 使用客户端的类名来设置记录器。

          对于这种情况,我们只需要做两件事 - 如果您使用的是 @FeignClient 注释。

          1. 为客户端配置日志级别
          2. 将适当的客户端记录器配置为DEBUG

          第一个可以这样完成:

          @Configuration
          public class FeignConfiguration {
              @Bean
              public Logger.Level loggerLevel() {
                  return Logger.Level.FULL;
              }
          }
          

          这将为所有 Feign 客户端配置日志级别,除非您在 @FeignClient 注释中使用特定配置。

          第二件事,为客户端的类/包启用DEBUG 日志记录。

          application.properties:

          logging.level.com.example.MyClient=DEBUG
          

          如果您正在为 Feign 配置而苦恼,您可能想看看我的 articlesmy course

          干杯。

          【讨论】:

            猜你喜欢
            • 2017-02-27
            • 2017-03-14
            • 1970-01-01
            • 1970-01-01
            • 2021-01-05
            • 1970-01-01
            • 2014-11-20
            • 2018-08-24
            相关资源
            最近更新 更多