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
21 import javax.servlet.Filter;
22 import javax.servlet.FilterChain;
23 import javax.servlet.FilterConfig;
24 import javax.servlet.ServletContext;
25 import javax.servlet.ServletException;
26 import javax.servlet.ServletRequest;
27 import javax.servlet.ServletResponse;
28
29
30
31
32
33
34
35
36
37
38
39
40 public class Log4jServletFilter implements Filter {
41
42 static final String ALREADY_FILTERED_ATTRIBUTE = Log4jServletFilter.class.getName() + ".FILTERED";
43
44 private ServletContext servletContext;
45 private Log4jWebLifeCycle initializer;
46
47 @Override
48 public void init(final FilterConfig filterConfig) throws ServletException {
49 this.servletContext = filterConfig.getServletContext();
50 this.servletContext.log("Log4jServletFilter initialized.");
51
52 this.initializer = Log4jWebInitializerImpl.getLog4jWebInitializer(this.servletContext);
53 this.initializer.clearLoggerContext();
54 }
55
56 @Override
57 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
58 throws IOException, ServletException {
59 if (request.getAttribute(ALREADY_FILTERED_ATTRIBUTE) != null) {
60 chain.doFilter(request, response);
61 } else {
62 request.setAttribute(ALREADY_FILTERED_ATTRIBUTE, true);
63
64 try {
65 this.initializer.setLoggerContext();
66
67 chain.doFilter(request, response);
68 } finally {
69 this.initializer.clearLoggerContext();
70 }
71 }
72 }
73
74 @Override
75 public void destroy() {
76 if (this.servletContext == null || this.initializer == null) {
77 throw new IllegalStateException("Filter destroyed before it was initialized.");
78 }
79 this.servletContext.log("Log4jServletFilter destroyed.");
80
81 this.initializer.setLoggerContext();
82 }
83 }