diff --git a/spring-cloud/spring-cloud-zuul/pom.xml b/spring-cloud/spring-cloud-zuul/pom.xml
index b1f2e886de..e0a63ae00b 100644
--- a/spring-cloud/spring-cloud-zuul/pom.xml
+++ b/spring-cloud/spring-cloud-zuul/pom.xml
@@ -19,6 +19,7 @@
spring-zuul-foos-resource
spring-zuul-ui
spring-zuul-rate-limiting
+ spring-zuul-post-filter
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/.gitignore b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/.gitignore
new file mode 100644
index 0000000000..0af075f75a
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/.gitignore
@@ -0,0 +1,2 @@
+target/*
+*.iml
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml
new file mode 100644
index 0000000000..c13aeb890e
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/pom.xml
@@ -0,0 +1,25 @@
+
+
+
+ spring-cloud-zuul
+ com.baeldung.spring.cloud
+ 0.0.1-SNAPSHOT
+
+ 4.0.0
+ spring-zuul-post-filter
+
+
+ Hoxton.SR1
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/ZuulPostFilterApplication.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/ZuulPostFilterApplication.java
new file mode 100644
index 0000000000..c9aad4e08d
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/ZuulPostFilterApplication.java
@@ -0,0 +1,14 @@
+package com.baeldung;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+
+@SpringBootApplication
+@EnableZuulProxy
+public class ZuulPostFilterApplication {
+
+ public static void main(String... args) {
+ SpringApplication.run(ZuulPostFilterApplication.class, args);
+ }
+}
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/controllers/GreetingController.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/controllers/GreetingController.java
new file mode 100644
index 0000000000..bd21b098ab
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/controllers/GreetingController.java
@@ -0,0 +1,16 @@
+package com.baeldung.controllers;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+@RequestMapping("/greeting")
+public class GreetingController {
+
+ @GetMapping("/simple")
+ public ResponseEntity getSimple() {
+ return ResponseEntity.ok("Hi");
+ }
+}
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java
new file mode 100644
index 0000000000..e589e27d46
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/java/com/baeldung/filters/ResponseLogFilter.java
@@ -0,0 +1,58 @@
+package com.baeldung.filters;
+
+import com.google.common.io.CharStreams;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import com.netflix.zuul.exception.ZuulException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.POST_TYPE;
+
+@Component
+public class ResponseLogFilter extends ZuulFilter {
+
+ private Logger logger = LoggerFactory.getLogger(ResponseLogFilter.class);
+
+ @Override
+ public String filterType() {
+ return POST_TYPE;
+ }
+
+ @Override
+ public int filterOrder() {
+ return 0;
+ }
+
+ @Override
+ public boolean shouldFilter() {
+ return true;
+ }
+
+ @Override
+ public Object run() throws ZuulException {
+
+ RequestContext context = RequestContext.getCurrentContext();
+ try (final InputStream responseDataStream = context.getResponseDataStream()) {
+
+ if(responseDataStream == null) {
+ logger.info("BODY: {}", "");
+ return null;
+ }
+
+ String responseData = CharStreams.toString(new InputStreamReader(responseDataStream, "UTF-8"));
+ logger.info("BODY: {}", responseData);
+
+ context.setResponseBody(responseData);
+ }
+ catch (Throwable e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+}
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/resources/application.yml b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/resources/application.yml
new file mode 100644
index 0000000000..ebcc7c8be7
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+server:
+ port: 8080
+zuul:
+ prefix: /api
+ routes:
+ greeting-service:
+ path: /greeting/**
+ url: forward:/greeting
+ foos-service:
+ path: /foos/**
+ url: http://localhost:8081/spring-zuul-foos-resource/foos
\ No newline at end of file
diff --git a/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/test/java/com/baeldung/ZuulPostFilterLiveTest.java b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/test/java/com/baeldung/ZuulPostFilterLiveTest.java
new file mode 100644
index 0000000000..475508879e
--- /dev/null
+++ b/spring-cloud/spring-cloud-zuul/spring-zuul-post-filter/src/test/java/com/baeldung/ZuulPostFilterLiveTest.java
@@ -0,0 +1,30 @@
+package com.baeldung;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class ZuulPostFilterLiveTest {
+
+ @LocalServerPort
+ private int port;
+ private static final String SIMPLE_GREETING = "/api/greeting/simple";
+ private TestRestTemplate restTemplate = new TestRestTemplate();
+
+ @Test
+ public void whenClientCallApi_thenLogAndReturnResponseBody() {
+ String url = "http://localhost:" + port + SIMPLE_GREETING;
+ ResponseEntity response = restTemplate.getForEntity(url, String.class);
+ assertTrue(response.getStatusCode().is2xxSuccessful());
+ assertEquals(response.getBody(), "Hi");
+ }
+}