假装登录在更改级别时无效。

43

我正在尝试为Feign rest客户端的每个请求启用日志记录。

然而,我无法使日志记录起作用,而“标准”的Slf4j日志记录却可以工作。

我有以下内容:

public MyClient() {
    initConnectionProperties();
    this.service = Feign.builder()
        .contract(new JAXRSContract())
        .decoder(getJacksonDecoder())
        .encoder(getJacksonEncoder())
        .requestInterceptor(new BasicAuthRequestInterceptor(user, password))
        .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); // working
}

你有SLF4J的任何配置文件可能会忽略MyClient类的日志吗? - Sigrist
1
在我的Spring Boot应用程序中,Feign的日志记录已在application.yml中配置为logging.level.com.mycompany.admintool.external.persons.resource.CustomerResource: DEBUG - Igor Bljahhin
我这里也遇到了同样的问题。你找到任何解决方案了吗? - Ali M
9个回答

35
您需要按照以下方式在application.properties中配置日志记录:

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

如果您正在使用application.yml,则:

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

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

选项包括:

  • NONE,不记录任何日志(默认)
  • 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)

如需更多细节,请参考此链接


它也可以通过 @Bean 设置,请参见 https://github.com/spring-cloud/spring-cloud-netflix/issues/1769 - whatacold

20

这是我使用自定义配置类进行日志记录的方法。

注意:Feign日志仅响应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

你应该从UserClientConfig中删除Configuration注解,因为它可以在没有@Configuration的情况下正常工作。但是@Configuration可以应用于整个bean应用程序,并且如果你在其中添加jackson beans等内容,则可能会破坏你的应用程序。 - roma2341

16
首先,你需要将你的Feign客户端类的日志级别设置为DEBUG,就像Maverick在他的回答中已经提到的那样。
然后,如果你使用Spring Boot,除了像Niraj在他的回答中提到的创建@Configuration类的选项之外,你还可以在你的应用程序属性/配置文件中单独配置每个客户端。
spring:
  cloud:
    openfeign:
      client:
        config:
          the_name_of_your_feign_client:
            connectTimeout: 5000
            readTimeout: 5000
            loggerLevel: basic

或者使用默认值而不是the_name_of_your_feign_client来以相同的方式配置所有的feign客户端:
spring:
  cloud:
    openfeign:
      client:
        config:
          default:
            connectTimeout: 5000
            readTimeout: 5000
            loggerLevel: basic

这适用于Spring Boot 3版本。 对于旧版本,路径将是:
feign:
    client:
        config:
            the_name_of_your_feign_client:

1
根据这个答案,我成功地通过在我的application.properties文件中添加以下行来增加日志级别:feign.client.config.<fiegn-client-name or default>.loggerLevel=fulllogging.level.<package>.<feign-client-interface>=DEBUG - dbaltor
1
重要提示,其中名称是@FeignClient(name = "fiegn-client-name")参数的值。 - Artem Ptushkin
从Spring Boot 3开始,配置位于spring下,即: spring: feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic - undefined

6

我之前没有设置客户端,我的客户端调用失败了,并且日志记录也无法工作。一旦我添加了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
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!
    }
}

FYI:这对我有用。我正在使用logback,在我的单元测试中没有得到任何输出。我有feignBuilder.logLevel(Logger.Level.FULL),但没有指定日志记录器。添加feignBuilder.logger(new Slf4JLogger());然后我就可以得到输出了。 - Alper Akture
谢谢!终于有一个答案不会让我陷入另一个兔子洞,让我看到发生了什么,而无需进一步搜索。我对现代软件开发的抱怨之一是我们添加了无尽的层次。仅仅配置调试就会让你陷入几个潜在的兔子洞:“好的,我要把那个文件放在哪里?”、“好的,我在哪里找到那个库?”、“好的,我应该导入哪个类来获取那个对象,没有人指定导入”或者“好的,我在哪里添加那个注释”。这个例子简单、完整、易懂。 - Steve Sether

4

您可能还需要将feign的日志级别配置为DEBUG。如果您使用的是Spring Boot,则可以尝试以下方法:

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

3

虽然我来晚了,但是让我试着帮助其他人找到这个线程。

我们需要区分两件事情。一种是使用普通Feign进行日志记录,另一种是使用Spring Cloud OpenFeign进行日志记录。

使用普通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或任何其他日志系统来完成。唯一重要的是将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配置时遇到困难,您可能需要查看我的文章课程。祝愉快。

2

Below code changes worked for me in 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支持的日志级别有:

NONE,不记录任何日志(默认)

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

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

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


0

您可以将日志级别放在引导/应用程序属性中,这将为您的Spring Boot应用程序提供所有调试日志。例如: logging.level.root=debug


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接