Skip to content

Commit

Permalink
adding use content length feature
Browse files Browse the repository at this point in the history
  • Loading branch information
minkowp committed Oct 14, 2019
1 parent 072d157 commit 15cfe1d
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public class ReactiveSpringLoggingAutoConfiguration {
private String url = "localhost:8500";
private String ignorePatterns;
private boolean logHeaders;
private boolean useContentLength;
private String trustStoreLocation;
private String trustStorePassword;
@Value("${spring.application.name:-}")
Expand All @@ -27,7 +28,7 @@ public UniqueIDGenerator generator() {

@Bean
public ReactiveSpringLoggingFilter reactiveSpringLoggingFilter() {
return new ReactiveSpringLoggingFilter(generator(), ignorePatterns, logHeaders);
return new ReactiveSpringLoggingFilter(generator(), ignorePatterns, logHeaders, useContentLength);
}

}
Original file line number Diff line number Diff line change
@@ -1,27 +1,19 @@
package pl.piomin.logging.reactive.filter;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.reactive.result.method.RequestMappingInfo;
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
import pl.piomin.logging.reactive.interceptor.RequestLoggingInterceptor;
import pl.piomin.logging.reactive.interceptor.ResponseLoggingInterceptor;
import pl.piomin.logging.reactive.util.UniqueIDGenerator;
import reactor.core.publisher.Mono;

import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.ServerWebExchangeDecorator;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import pl.piomin.logging.reactive.interceptor.RequestLoggingInterceptor;
import pl.piomin.logging.reactive.interceptor.ResponseLoggingInterceptor;
import pl.piomin.logging.reactive.util.UniqueIDGenerator;
import reactor.core.publisher.Mono;

import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.List;

import static net.logstash.logback.argument.StructuredArguments.value;

Expand All @@ -31,11 +23,13 @@ public class ReactiveSpringLoggingFilter implements WebFilter {
private UniqueIDGenerator generator;
private String ignorePatterns;
private boolean logHeaders;
private boolean useContentLength;

public ReactiveSpringLoggingFilter(UniqueIDGenerator generator, String ignorePatterns, boolean logHeaders) {
public ReactiveSpringLoggingFilter(UniqueIDGenerator generator, String ignorePatterns, boolean logHeaders, boolean useContentLength) {
this.generator = generator;
this.ignorePatterns = ignorePatterns;
this.logHeaders = logHeaders;
this.useContentLength = useContentLength;
}

@Override
Expand All @@ -45,12 +39,15 @@ public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
} else {
generator.generateAndSetMDC(exchange.getRequest());
final long startTime = System.currentTimeMillis();
if (logHeaders)
LOGGER.info("Request: method={}, uri={}, headers={}, audit={}", exchange.getRequest().getMethod(),
exchange.getRequest().getURI().getPath(), exchange.getRequest().getHeaders(), value("audit", true));
else
LOGGER.info("Request: method={}, uri={}, audit={}", exchange.getRequest().getMethod(),
exchange.getRequest().getURI().getPath(), value("audit", true));
List<String> header = exchange.getRequest().getHeaders().get("Content-Length");
if (useContentLength && (header == null || header.get(0).equals("0"))) {
if (logHeaders)
LOGGER.info("Request: method={}, uri={}, headers={}, audit={}", exchange.getRequest().getMethod(),
exchange.getRequest().getURI().getPath(), exchange.getRequest().getHeaders(), value("audit", true));
else
LOGGER.info("Request: method={}, uri={}, audit={}", exchange.getRequest().getMethod(),
exchange.getRequest().getURI().getPath(), value("audit", true));
}
ServerWebExchangeDecorator exchangeDecorator = new ServerWebExchangeDecorator(exchange) {
@Override
public ServerHttpRequest getRequest() {
Expand All @@ -59,7 +56,7 @@ public ServerHttpRequest getRequest() {

@Override
public ServerHttpResponse getResponse() {
return new ResponseLoggingInterceptor(super.getResponse(), startTime);
return new ResponseLoggingInterceptor(super.getResponse(), startTime, logHeaders);
}
};
return chain.filter(exchangeDecorator)
Expand All @@ -74,12 +71,15 @@ public ServerHttpResponse getResponse() {

private void logResponse(long startTime, ServerHttpResponse response, int overriddenStatus) {
final long duration = System.currentTimeMillis() - startTime;
if (logHeaders)
LOGGER.info("Response({} ms): status={}, headers={}, audit={}", value("X-Response-Time", duration),
value("X-Response-Status", overriddenStatus), response.getHeaders(), value("audit", true));
else
LOGGER.info("Response({} ms): status={}, audit={}", value("X-Response-Time", duration),
value("X-Response-Status", overriddenStatus), value("audit", true));
List<String> header = response.getHeaders().get("Content-Length");
if (useContentLength && (header == null || header.get(0).equals("0"))) {
if (logHeaders)
LOGGER.info("Response({} ms): status={}, headers={}, audit={}", value("X-Response-Time", duration),
value("X-Response-Status", overriddenStatus), response.getHeaders(), value("audit", true));
else
LOGGER.info("Response({} ms): status={}, audit={}", value("X-Response-Time", duration),
value("X-Response-Status", overriddenStatus), value("audit", true));
}
}

}
Original file line number Diff line number Diff line change
@@ -1,22 +1,18 @@
package pl.piomin.logging.reactive.interceptor;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.channels.Channels;

import org.apache.commons.io.IOUtils;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.channels.Channels;

import static net.logstash.logback.argument.StructuredArguments.value;

Expand All @@ -25,10 +21,12 @@ public class ResponseLoggingInterceptor extends ServerHttpResponseDecorator {
private static final Logger LOGGER = LoggerFactory.getLogger(ResponseLoggingInterceptor.class);

private long startTime;
private boolean logHeaders;

public ResponseLoggingInterceptor(ServerHttpResponse delegate, long startTime) {
public ResponseLoggingInterceptor(ServerHttpResponse delegate, long startTime, boolean logHeaders) {
super(delegate);
this.startTime = startTime;
this.logHeaders = logHeaders;
}

@Override
Expand All @@ -38,9 +36,13 @@ public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
Channels.newChannel(baos).write(dataBuffer.asByteBuffer().asReadOnlyBuffer());
String bodyx = IOUtils.toString(baos.toByteArray(), "UTF-8");
LOGGER.info("Response({} ms): status={}, payload={}, audit={}", value("X-Response-Time", System.currentTimeMillis() - startTime),
value("X-Response-Status", getStatusCode().value()), bodyx, value("audit", true));
String bodyRes = IOUtils.toString(baos.toByteArray(), "UTF-8");
if (logHeaders)
LOGGER.info("Response({} ms): status={}, payload={}, audit={}", value("X-Response-Time", System.currentTimeMillis() - startTime),
value("X-Response-Status", getStatusCode().value()), bodyRes, value("audit", true));
else
LOGGER.info("Response({} ms): status={}, payload={}, audit={}", value("X-Response-Time", System.currentTimeMillis() - startTime),
value("X-Response-Status", getStatusCode().value()), bodyRes, value("audit", true));
} catch (IOException e) {
e.printStackTrace();
} finally {
Expand Down

0 comments on commit 15cfe1d

Please sign in to comment.