假日记录不起作用

时间:2017-03-12 18:17:45

标签: java feign

我试图让来自Feign rest客户端的每个请求的日志记录工作。但是我无法让日志工作,而标准' 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
    }

8 个答案:

答案 0 :(得分:7)

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

numm

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

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

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

选项包括:

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

示例:

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

有关详细信息,请参阅this

答案 1 :(得分:4)

这就是我使用Custom Config类登录的方式

注意:伪装日志仅响应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();    

}

application.properties

logging.level.<pcakgepath>.UserClient: DEBUG

答案 2 :(得分:3)

要启用日志记录,我们需要在 application.properties 文件中将包含我们的 feign 客户端的类或包的 Spring Boot 日志记录级别设置为 DEBUG:< /p>

logging.level.<packageName>.<className> = DEBUG

或者,如果我们有一个包含所有 feign 客户端的包,我们可以将其添加到整个包中:

logging.level.<packageName> = DEBUG

接下来,我们需要为 feign 客户端设置日志级别。请注意,上一步只是启用日志记录。

有四种日志级别可供选择:

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

我们可以通过java配置或在我们的属性文件中配置它们。

Java 配置

我们需要声明一个配置类,我们称之为FeignConfig

public class FeignConfig {
 
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}

之后,我们将配置类绑定到我们的假客户端类FooClient

@FeignClient(name = "foo-client", configuration = FeignConfig.class)
public interface FooClient {
 
    // methods for different requests
}

使用属性

第二种方法是在我们的 application.properties 中设置它。让我们在这里引用我们的假客户端的名称,在我们的例子中是 foo-client:

feign.client.config.foo-client.loggerLevel = full

或者,我们可以覆盖所有 feign 客户端的默认配置级别:

feign.client.config.default.loggerLevel = full

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

我没有设置客户端,客户端调用失败,并且日志记录无法正常工作。.一旦我添加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 :(得分:1)

以下代码更改在 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,记录请求和响应的标头、正文和元数据

答案 6 :(得分:0)

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!
    }
}

答案 7 :(得分:0)

首先,您需要将伪客户端类的日志记录级别设置为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: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic