Skip to content

Commit

Permalink
Add LoggingFilter
Browse files Browse the repository at this point in the history
  • Loading branch information
DaegiKim committed Aug 22, 2019
1 parent 65fb389 commit d3603b8
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 29 deletions.
35 changes: 27 additions & 8 deletions app/ErrorHandler.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,47 @@
import exceptions.FinanceRuntimeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.http.HttpErrorHandler;
import play.mvc.Http.RequestHeader;
import play.mvc.Result;
import play.mvc.Results;

import javax.inject.Singleton;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import java.util.concurrent.CompletionStage;

@Singleton
public class ErrorHandler implements HttpErrorHandler {
public CompletionStage<Result> onClientError(
RequestHeader request, int statusCode, String message) {
return CompletableFuture.completedFuture(
Results.status(statusCode, "A client error occurred: " + message));
private static final Logger log = LoggerFactory.getLogger(ErrorHandler.class);

public CompletionStage<Result> onClientError(RequestHeader request, int statusCode, String message) {
return CompletableFuture.completedFuture(Results.status(statusCode, "A client error occurred: " + message));
}

public CompletionStage<Result> onServerError(RequestHeader request, Throwable exception) {
if(exception instanceof FinanceRuntimeException) {
logging(request, exception);

if(exception instanceof CompletionException) {
CompletionException completionException = (CompletionException) exception;
if(completionException.getCause() != null && completionException.getCause() instanceof FinanceRuntimeException) {
FinanceRuntimeException financeRuntimeException = (FinanceRuntimeException) completionException.getCause();
return CompletableFuture.completedFuture(financeRuntimeException.getResult());
}
}
else if(exception instanceof FinanceRuntimeException) {
FinanceRuntimeException financeRuntimeException = (FinanceRuntimeException) exception;
return CompletableFuture.completedFuture(financeRuntimeException.getResult());
} else {
return CompletableFuture.completedFuture(
Results.internalServerError("A server error occurred: " + exception.getMessage()));
}

return CompletableFuture.completedFuture(Results.internalServerError("A server error occurred: " + exception.getMessage()));
}

private void logging(RequestHeader request, Throwable exception) {
log.error(
"{} {} {}",
request.method(),
request.uri(),
exception.getMessage());
}
}
11 changes: 11 additions & 0 deletions app/Filters.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import filters.LoggingFilter;
import play.http.DefaultHttpFilters;
import play.filters.gzip.GzipFilter;
import javax.inject.Inject;

public class Filters extends DefaultHttpFilters {
@Inject
public Filters(GzipFilter gzip, LoggingFilter logging) {
super(gzip, logging);
}
}
45 changes: 45 additions & 0 deletions app/filters/LoggingFilter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package filters;

import akka.stream.Materializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import play.mvc.Filter;
import play.mvc.Http;
import play.mvc.Result;

import javax.inject.Inject;
import java.util.concurrent.CompletionStage;
import java.util.function.Function;

public class LoggingFilter extends Filter {
private static final Logger log = LoggerFactory.getLogger(LoggingFilter.class);

@Inject
public LoggingFilter(Materializer mat) {
super(mat);
}

@Override
public CompletionStage<Result> apply(
Function<Http.RequestHeader, CompletionStage<Result>> nextFilter,
Http.RequestHeader requestHeader) {
long startTime = System.currentTimeMillis();

return nextFilter
.apply(requestHeader)
.thenApply(
result -> {
long endTime = System.currentTimeMillis();
long requestTime = endTime - startTime;

log.info(
"{} {} took {}ms and returned {}",
requestHeader.method(),
requestHeader.uri(),
requestTime,
result.status());

return result.withHeader("Request-Time", "" + requestTime);
});
}
}
30 changes: 9 additions & 21 deletions conf/logback.xml
Original file line number Diff line number Diff line change
@@ -1,35 +1,23 @@
<!-- https://www.playframework.com/documentation/latest/SettingsLogger -->
<!--
~ Copyright (C) 2009-2019 Lightbend Inc. <https://www.lightbend.com>
-->
<!-- The default logback configuration that Play uses in dev mode if no other configuration is provided -->
<configuration>

<conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" />

<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home:-.}/logs/application.log</file>
<encoder>
<pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
</encoder>
</appender>

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%coloredLevel %logger{15} - %message%n%xException{10}</pattern>
</encoder>
</appender>

<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>

<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="STDOUT" />
</appender>

<logger name="play" level="INFO" />
<logger name="application" level="DEBUG" />

<root level="WARN">
<appender-ref ref="ASYNCFILE" />
<appender-ref ref="ASYNCSTDOUT" />
<logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" />

<root level="INFO">
<appender-ref ref="STDOUT" />
</root>

</configuration>
</configuration>

0 comments on commit d3603b8

Please sign in to comment.