package ee.telekom.workflow.web.util; import java.io.IOException; import java.lang.invoke.MethodHandles; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.web.filter.OncePerRequestFilter; /** * Request logging filter that writes a log entry after the request is completed. It also sets up MDC parameters for request durations. * * @author Erko Hansar */ public class RequestLoggingFilter extends OncePerRequestFilter{ private static final Logger log = LoggerFactory.getLogger( MethodHandles.lookup().lookupClass() ); private static final String MDC_KEY = "requestmdc"; private boolean includeQueryString = false; public boolean isIncludeQueryString(){ return includeQueryString; } public void setIncludeQueryString( boolean includeQueryString ){ this.includeQueryString = includeQueryString; } @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain ) throws ServletException, IOException{ long start = System.currentTimeMillis(); MDC.put( MDC_KEY, getMappedDiagnosticContextMessage( request ) ); try{ filterChain.doFilter( request, response ); } finally{ if( log.isDebugEnabled() ){ log.info( createMessage( request, start ) ); } MDC.remove( MDC_KEY ); } } private String createMessage( HttpServletRequest request, long start ){ StringBuilder msg = new StringBuilder(); msg.append( request.getRequestURI() ); if( isIncludeQueryString() ){ msg.append( '?' ).append( request.getQueryString() ); } msg.append( " took " ); msg.append( System.currentTimeMillis() - start ); msg.append( "ms" ); return msg.toString(); } private String getMappedDiagnosticContextMessage( HttpServletRequest request ){ String user = request.getRemoteUser(); if( user != null ){ return (new StringBuilder()).append( "[" ).append( user ).append( "]" ).toString(); } return "[anonymous]"; } }