You need to configure logging in application.properties as below:

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

If you're using application.yml then:

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

The log level can be set to tell Feign how much to log.

Options are:

  • NONE, No logging (DEFAULT)
  • BASIC, Log only the request method and URL and the response status code and execution time
  • HEADERS, Log the basic information along with request and response headers
  • FULL, Log the headers, body, and metadata for both requests and responses

Example:

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

For more details, you can refer this

Answer from Maverick on Stack Overflow
🌐
Baeldung
baeldung.com › home › spring › spring boot › feign logging configuration
Feign Logging Configuration | Baeldung
February 26, 2025 - Feign client logging helps us to have a better view of the requests that have been made.
🌐
GitHub
github.com › OpenFeign › feign › blob › master › core › src › main › java › feign › Logger.java
feign/core/src/main/java/feign/Logger.java at master · OpenFeign/feign
* Override to log requests and responses using your own implementation. Messages will be http · * request and response text. * * @param configKey value of {@link Feign#configKey(Class, java.lang.reflect.Method)} * @param format {@link java.util.Formatter format string} * @param args arguments applied to {@code format} */ protected abstract void log(String configKey, String format, Object...
🌐
Spring Cloud
cloud.spring.io › spring-cloud-openfeign › 2.2.x › reference › html
Spring Cloud OpenFeign
The Logger.Level object that you may configure per client, tells Feign how much to log.
🌐
Apps Developer Blog
appsdeveloperblog.com › home › spring framework › spring cloud › feign client logging
Feign Client Logging - Apps Developer Blog
November 9, 2022 - To enable Feign Client logging, you will need to update an application.properties file of your project with a new property.
🌐
Getdocs
spring.getdocs.org › en-US › spring-cloud-docs › spring-cloud-openfeign › spring-cloud-feign › feign-logging.html
Untitled :: Spring Docs
A logger is created for each Feign client created. By default the name of the logger is the full class name of the interface used to create the Feign client.
🌐
O'Reilly
oreilly.com › library › view › mastering-spring-boot › 9781787127562 › 43853f02-3bf6-4c2f-8661-e94899a05cdd.xhtml
Feign logging - Mastering Spring Boot 2.0 [Book]
May 31, 2018 - The Feign client only responds to a DEBUG level and, by default, the file name of the log is the full class name of the interface used to create the Feign client. A logger is created for each Feign client.
Author: Dinesh Rajput
Published: 2018
Pages: 390
🌐
Medium
medium.com › @reetesh043 › handling-logging-in-spring-boot-feignclient-a-complete-guide-0831676b8526
Handling Logging in Spring Boot FeignClient: A Complete Guide | by Reetesh Kumar | Medium
August 5, 2025 - Without proper logging, debugging becomes a guessing game. By default, Feign logging is disabled (NONE level), so you need to explicitly configure it to capture communication details between your microservices.
🌐
Medium
medium.com › @somarouthu.sivaprasads › spring-cloud-feign-858c225e2341
Spring Cloud Feign. Logging: | by SivaprasadS | Medium
March 15, 2019 - class CustomFeignLogger extends Slf4jLogger { @Override protected void logRequest(String configKey, Level logLevel, Request request) { FeignRequest feignRequest = new FeignRequest(); feignRequest.setMethod(request.method()); feignRequest.setUrl(request.url()); if (logLevel.ordinal() >= Level.HEADERS.ordinal()) { for (String field : request.headers().keySet()) { for (String value : valuesOrEmpty(request.headers(), field)) { feignRequest.addHeader(field, value); } } if (request.body() != null && logLevel.ordinal() >= Level.FULL.ordinal()) { feignRequest.setBody(request.charset() != null ?
Find elsewhere
🌐
Medium
bvn13.medium.com › normalized-logger-for-openfeign-8727b4e5d776
Normalized Logger for OpenFeign. Standard Feign logger provides the only… | by Vyacheslav Boyko | Medium
August 12, 2022 - Normalized Logger for OpenFeign Standard OpenFeign logger provides the only approach to log communications — it logs every header in separated log entries, the body goes into another log entry. It …
🌐
Poznachowski
blog.poznachowski.pl › posts › feign-slf4j-logger
Feign Slf4j Logger you wish you had // It's SOAP's Fault...
August 17, 2021 - When it comes to Feign and logging its requests and responses, it provides Logger - an abstraction layer with dedicated set of log Levels:
🌐
Mayukh Datta
thecoducer.com › 2023 › 03 › custom-logger-configuration-for-feign-clients
Custom Logger Configuration for Feign Clients · Mayukh Datta
March 26, 2023 - Feign uses SL4j Logger under the hood, and the default logging configuration prints each piece of information on a separate line, which I found disturbing.
🌐
Javacodemonk
javacodemonk.com › feign-client-logging-and-connection-timeout-spring-boot-60b8826d
Feign Client Logging and connection timeout
July 14, 2020 - There are two ways we can configure the logging level for feign clients - using properties and using java configuration.
🌐
GitHub
github.com › spring-cloud › spring-cloud-netflix › issues › 1769
Feign Logging Configuration Not Working As Documented · Issue #1769 · spring-cloud/spring-cloud-netflix
March 11, 2017 - And I've configured my Config Server to customize the logging level for the Feign Client with this full package name: com.example.ReservationReader.
🌐
GitHub
github.com › OpenFeign › feign
GitHub - OpenFeign/feign: Feign makes writing java http clients easier · GitHub
SLF4JModule allows directing Feign's logging to SLF4J, allowing you to easily use a logging backend of your choice (Logback, Log4J, etc.)
Top answer
1 of 6
83

Feign has out of box logging mechanism and it can be achieved through simple steps.

If you are using spring-cloud-starter-feign

Feign using Slf4jLogger for logging.Feign logging documentation

As per doc, the below logging levels are available to configure,

  • NONE - No logging (DEFAULT).
  • BASIC - Log only the request method and URL and the response status code and execution time.
  • HEADERS - Log the basic information along with request and response headers.
  • FULL - Log the headers, body, and metadata for both requests and responses.

Injecting the Logger.Level bean is enough.

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

OR

If you prefer using configuration properties to configured all @FeignClient, you can create configuration properties with default feign name.

feign:
  client:
    config:
      default:
        loggerLevel: basic

of if you are using a newer version (Spring Boot 3) the config will be like:

spring:
  cloud:
    openfeign:
      client:
        config:
          default:
            loggerLevel: full

If you are using 'io.github.openfeign:feign-core'

If you are constructing the Feign builder then you can mention logLevel(Level.BASIC) as

Feign.builder()
    .logger(new Slf4jLogger())
    .logLevel(Level.BASIC)
    .target(SomeFeignClient.class, url);

We have the flexibility to customize the logging message

The default feign request and response logging

Request logging

Resopnse logging

we can customize the feign request, response logging pattern by overriding Logger#logRequest and Logger#logAndRebufferResponse methods. In the following example, we have customized request logging pattern

log(configKey, "---> %s %s HTTP/1.1 (%s-byte body) ", request.httpMethod().name(), request.url(), bodyLength);

and response logging pattern

log(configKey, "<--- %s %s HTTP/1.1 %s (%sms) ", request.httpMethod().name(), request.url(), status, elapsedTime);

The Full example is


import feign.Logger;
import feign.Request;
import feign.Response;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

import static feign.Logger.Level.HEADERS;

@Slf4j
public class CustomFeignRequestLogging extends Logger {

    @Override
    protected void logRequest(String configKey, Level logLevel, Request request) {

        if (logLevel.ordinal() >= HEADERS.ordinal()) {
            super.logRequest(configKey, logLevel, request);
        } else {
            int bodyLength = 0;
            if (request.requestBody().asBytes() != null) {
                bodyLength = request.requestBody().asBytes().length;
            }
            log(configKey, "---> %s %s HTTP/1.1 (%s-byte body) ", request.httpMethod().name(), request.url(), bodyLength);
        }
    }

    @Override
    protected Response logAndRebufferResponse(String configKey, Level logLevel, Response response, long elapsedTime)
            throws IOException {
        if (logLevel.ordinal() >= HEADERS.ordinal()) {
            return super.logAndRebufferResponse(configKey, logLevel, response, elapsedTime);
        } else {
            int status = response.status();
            Request request = response.request();
            log(configKey, "<--- %s %s HTTP/1.1 %s (%sms) ", request.httpMethod().name(), request.url(), status, elapsedTime);
            return response;   
        }        
    }


    @Override
    protected void log(String configKey, String format, Object... args) {
        log.debug(format(configKey, format, args));
    }

    protected String format(String configKey, String format, Object... args) {
        return String.format(methodTag(configKey) + format, args);
    }
}

NOTE: Request payload can be easily logged through

String bodyText =
              request.charset() != null ? new String(request.body(), request.charset()) : null;

but be careful writing the response payload after you are reading the input stream Util.toByteArray(response.body().asInputStream()) then you have to construct the response again like response.toBuilder().body(bodyData).build(). Otherwise, you will end up with the expection. The reason is response streams are read and always closed before returning, thats why the method is named as logAndRebufferResponse

How to use the custom CustomFeignRequestLogging?

If you are building feign client using just 'io.github.openfeign:feign-core'

Feign.builder()
     .logger(new CustomFeignRequestLogging())
     .logLevel(feign.Logger.Level.BASIC);

If you are using 'org.springframework.cloud:spring-cloud-starter-openfeign'

@Configuration
public class FeignLoggingConfiguration {

    @Bean
    public CustomFeignRequestLogging customFeignRequestLogging() {
        return new CustomFeignRequestLogging();
    }

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

2 of 6
13

The accepted answer did not work for me until I added the following settings to my application.yml file:

logging:
  level:
    com:
      mypackage1:
        mysubackage1:
          mysubpackage2: DEBUG
🌐
Javadoc.io
javadoc.io › doc › io.github.openfeign › feign-core › 10.7.0 › feign › Logger.html
Logger - feign-core 10.7.0 javadoc
Latest version of io.github.openfeign:feign-core · https://javadoc.io/doc/io.github.openfeign/feign-core · Current version 10.7.0 · https://javadoc.io/doc/io.github.openfeign/feign-core/10.7.0 · package-list path (used for javadoc generation -link option) https://javadoc.io/doc/io.github.openfeign/feign-core/10.7.0/package-list ·
🌐
Javadoc.io
javadoc.io › doc › io.github.openfeign › feign-core › 11.0 › feign › Logger.Level.html
Logger.Level - feign-core 11.0 javadoc
Latest version of io.github.openfeign:feign-core · https://javadoc.io/doc/io.github.openfeign/feign-core · Current version 11.0 · https://javadoc.io/doc/io.github.openfeign/feign-core/11.0 · package-list path (used for javadoc generation -link option) https://javadoc.io/doc/io.github.openfeign/feign-core/11.0/package-list ·
🌐
Tabnine
tabnine.com › home › code library
Code Library - Tabnine
July 25, 2024 - Log in Get a demo · The Tabnine Code Library is no longer available — but you can still get the answers and suggestions you need from our AI code assistant. Get started in minutes with our free version right in your IDE, or try Tabnine Pro free for 90 days.