Implemented logging responses
This commit is contained in:
parent
ec85162e00
commit
beb2702257
|
@ -0,0 +1,58 @@
|
|||
package net.dankito.banking.fints.rest
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import org.slf4j.LoggerFactory
|
||||
import javax.inject.Inject
|
||||
import javax.ws.rs.container.ContainerRequestContext
|
||||
import javax.ws.rs.container.ContainerResponseContext
|
||||
import javax.ws.rs.container.ContainerResponseFilter
|
||||
import javax.ws.rs.core.Response
|
||||
import javax.ws.rs.ext.Provider
|
||||
|
||||
|
||||
@Provider
|
||||
class LoggingFilter : ContainerResponseFilter {
|
||||
|
||||
companion object {
|
||||
private val log = LoggerFactory.getLogger(LoggingFilter::class.java)
|
||||
}
|
||||
|
||||
|
||||
@Inject
|
||||
internal lateinit var mapper: ObjectMapper
|
||||
|
||||
|
||||
override fun filter(requestContext: ContainerRequestContext, responseContext: ContainerResponseContext) {
|
||||
if (responseContext.statusInfo.family != Response.Status.Family.SUCCESSFUL) {
|
||||
log.warn("Request ${geRequestUrl(requestContext)} failed: ${getResponseStatus(responseContext)}"
|
||||
+ System.lineSeparator() + getHeadersAsString(responseContext)
|
||||
+ System.lineSeparator() + getBodyAsString(responseContext))
|
||||
}
|
||||
else if (log.isDebugEnabled) {
|
||||
log.debug("Result of request ${geRequestUrl(requestContext)}: ${getResponseStatus(responseContext)}"
|
||||
+ System.lineSeparator() + getHeadersAsString(responseContext)
|
||||
+ System.lineSeparator() + getBodyAsString(responseContext))
|
||||
}
|
||||
}
|
||||
|
||||
private fun geRequestUrl(requestContext: ContainerRequestContext): String {
|
||||
return "${requestContext.request.method} ${requestContext.uriInfo.requestUri}"
|
||||
}
|
||||
|
||||
private fun getResponseStatus(responseContext: ContainerResponseContext): String {
|
||||
return "${responseContext.status} ${responseContext.statusInfo.reasonPhrase}"
|
||||
}
|
||||
|
||||
private fun getHeadersAsString(responseContext: ContainerResponseContext): String {
|
||||
return responseContext.stringHeaders.map { header -> "${header.key}: ${header.value}" }.joinToString("\n", "Headers:\n")
|
||||
}
|
||||
|
||||
private fun getBodyAsString(responseContext: ContainerResponseContext): String {
|
||||
if (responseContext.hasEntity()) {
|
||||
return "Body ${responseContext.entityClass.name}:\n" + mapper.writeValueAsString(responseContext.entity)
|
||||
}
|
||||
|
||||
return "<No response body>"
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue