1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.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
29
30
31
32
33
34
35
36
37
38
39 public class Log4jServletFilter implements Filter {
40
41 static final String ALREADY_FILTERED_ATTRIBUTE = Log4jServletFilter.class.getName() + ".FILTERED";
42
43 private ServletContext servletContext;
44 private Log4jWebInitializer initializer;
45
46 @Override
47 public void init(final FilterConfig filterConfig) throws ServletException {
48 this.servletContext = filterConfig.getServletContext();
49 this.servletContext.log("Log4jServletFilter initialized.");
50
51 this.initializer = Log4jWebInitializerImpl.getLog4jWebInitializer(this.servletContext);
52 this.initializer.clearLoggerContext();
53 }
54
55 @Override
56 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
57 throws IOException, ServletException {
58 if (request.getAttribute(ALREADY_FILTERED_ATTRIBUTE) != null) {
59 chain.doFilter(request, response);
60 } else {
61 request.setAttribute(ALREADY_FILTERED_ATTRIBUTE, true);
62
63 try {
64 this.initializer.setLoggerContext();
65
66 chain.doFilter(request, response);
67 } finally {
68 this.initializer.clearLoggerContext();
69 }
70 }
71 }
72
73 @Override
74 public void destroy() {
75 if (this.servletContext == null || this.initializer == null) {
76 throw new IllegalStateException("Filter destroyed before it was initialized.");
77 }
78 this.servletContext.log("Log4jServletFilter destroyed.");
79
80 this.initializer.setLoggerContext();
81 }
82 }