-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
92 additions
and
29 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
}); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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> |