1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.web;
18
19 import java.io.IOException;
20 import javax.servlet.Filter;
21 import javax.servlet.FilterChain;
22 import javax.servlet.FilterConfig;
23 import javax.servlet.ServletContext;
24 import javax.servlet.ServletException;
25 import javax.servlet.ServletRequest;
26 import javax.servlet.ServletResponse;
27
28 import org.apache.logging.log4j.Logger;
29 import org.apache.logging.log4j.status.StatusLogger;
30
31
32
33
34
35
36
37
38
39
40
41
42 public class Log4jServletFilter implements Filter {
43
44 private static final Logger LOGGER = StatusLogger.getLogger();
45
46 static final String ALREADY_FILTERED_ATTRIBUTE = Log4jServletFilter.class.getName() + ".FILTERED";
47
48 private ServletContext servletContext;
49 private Log4jWebLifeCycle initializer;
50
51 @Override
52 public void init(final FilterConfig filterConfig) throws ServletException {
53 this.servletContext = filterConfig.getServletContext();
54 LOGGER.debug("Log4jServletFilter initialized.");
55
56 this.initializer = WebLoggerContextUtils.getWebLifeCycle(this.servletContext);
57 this.initializer.clearLoggerContext();
58 }
59
60 @Override
61 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
62 throws IOException, ServletException {
63 if (request.getAttribute(ALREADY_FILTERED_ATTRIBUTE) != null) {
64 chain.doFilter(request, response);
65 } else {
66 request.setAttribute(ALREADY_FILTERED_ATTRIBUTE, Boolean.TRUE);
67
68 try {
69 this.initializer.setLoggerContext();
70
71 chain.doFilter(request, response);
72 } finally {
73 this.initializer.clearLoggerContext();
74 }
75 }
76 }
77
78 @Override
79 public void destroy() {
80 if (this.servletContext == null || this.initializer == null) {
81 throw new IllegalStateException("Filter destroyed before it was initialized.");
82 }
83 LOGGER.debug("Log4jServletFilter destroyed.");
84
85 this.initializer.setLoggerContext();
86 }
87 }