Processing Time Filter
package pl.matt.filter;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
 
/**
 * @author Mateusz Zięba
 * filtr logujący czas generowania strony
 */
public class ProcessingTimeFilter implements Filter {
    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ProcessingTimeFilter.class);
    private FilterConfig config;
 
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }
 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws java.io.IOException,
            ServletException {
        // Record the start time of the request
        long before = System.currentTimeMillis();
 
        // Invoke the Servlet
        chain.doFilter(req, res);
 
        // Capture the end time of the request
        long after = System.currentTimeMillis();
 
        // Display the elapsed time to the standard output
        LOG.info(((HttpServletRequest)req).getRequestURI() + " rendered in " + (after - before) + " ms.");
    }
 
    public void destroy() {
        this.config = null;
    }
}
<filter>
    <filter-name>TimerFilter</filter-name>
    <filter-class>pl.matt.filter.ProcessingTimeFilter</filter-class>
</filter>
 
<filter-mapping>
    <filter-name>TimerFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

przykładowa konfiguracja log4ja. Parametr additivity="false" spowoduje, że informacje o czasie generowania stron pojawią się tylko w REQUESTS_FILE

<logger name="pl.matt.filter.TimeProcessingFilter" additivity="false">
        <level value="INFO" />
        <appender-ref ref="REQUESTS_FILE" />
    </logger>
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License