package eu.europeana.cloud.service.commons.logging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.impl.Log4jLoggerFactory; import sun.security.provider.certpath.OCSPResponse; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.container.PreMatching; import javax.ws.rs.core.Context; import javax.ws.rs.core.Request; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @PreMatching public class LoggingFilter implements ContainerResponseFilter, ContainerRequestFilter { @Context HttpServletRequest httpRequest; private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(LoggingFilter.class); private StringBuilder logMessageBuilder; @Override public void filter(ContainerRequestContext requestContext) throws IOException { publishRequestStartTimeTo(requestContext); } @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException { LoggingMessage message = buildMessage(requestContext, responseContext); switch (message.getStatus()){ case 404: case 409: LOGGER.warn(message.getMessage()); break; default: LOGGER.info(message.getMessage()); break; } } private void publishRequestStartTimeTo(ContainerRequestContext requestContext) { long requestStartTime = System.currentTimeMillis(); requestContext.setProperty("startTime", requestStartTime); } private LoggingMessage buildMessage(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { // LoggingMessageBuilder builder = new LoggingMessageBuilder(); LoggingMessage message = builder .withStatusCode(responseContext.getStatus()) .withRemoteAddr(readRemoteAddr()) .withRequestTime(calculateRequestTime(requestContext)) .withResourcePath(readRequestPath(requestContext)) .withRequestMethod(readRequestMethod(requestContext)) .build(); return message; } private String readRemoteAddr(){ try{ return httpRequest.getRemoteAddr(); }catch (Exception e){ return "error.remote.address"; } } private long calculateRequestTime(ContainerRequestContext requestContext){ long now = System.currentTimeMillis(); long requestTime = now - (long) requestContext.getProperty("startTime"); return requestTime; } private String readRequestPath(ContainerRequestContext requestContext){ return requestContext.getUriInfo().getPath().replaceAll(" ","%20"); } private String readRequestMethod(ContainerRequestContext requestContext){ return requestContext.getMethod(); } }