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.util.EnumSet;
20 import java.util.Set;
21 import jakarta.servlet.DispatcherType;
22 import jakarta.servlet.FilterRegistration;
23 import jakarta.servlet.ServletContainerInitializer;
24 import jakarta.servlet.ServletContext;
25 import jakarta.servlet.ServletException;
26
27 import org.apache.logging.log4j.Logger;
28 import org.apache.logging.log4j.status.StatusLogger;
29
30
31
32
33
34
35 public class Log4jServletContainerInitializer implements ServletContainerInitializer {
36
37 @Override
38 public void onStartup(final Set<Class<?>> classes, final ServletContext servletContext) throws ServletException {
39 if (servletContext.getMajorVersion() > 2 && servletContext.getEffectiveMajorVersion() > 2 &&
40 !"true".equalsIgnoreCase(servletContext.getInitParameter(
41 Log4jWebSupport.IS_LOG4J_AUTO_INITIALIZATION_DISABLED
42 ))) {
43 final Logger LOGGER = StatusLogger.getLogger();
44
45 LOGGER.debug("Log4jServletContainerInitializer starting up Log4j in Servlet 3.0+ environment.");
46
47 final FilterRegistration.Dynamic filter =
48 servletContext.addFilter("log4jServletFilter", Log4jServletFilter.class);
49 if (filter == null) {
50 LOGGER.warn("WARNING: In a Servlet 3.0+ application, you should not define a " +
51 "log4jServletFilter in web.xml. Log4j 2 normally does this for you automatically. Log4j 2 " +
52 "web auto-initialization has been canceled.");
53 return;
54 }
55
56 final Log4jWebLifeCycle initializer = WebLoggerContextUtils.getWebLifeCycle(servletContext);
57 initializer.start();
58 initializer.setLoggerContext();
59
60 if (!"true".equalsIgnoreCase(servletContext.getInitParameter(
61 Log4jWebSupport.IS_LOG4J_AUTO_SHUTDOWN_DISABLED))) {
62 servletContext.addListener(new Log4jServletContextListener());
63 }
64
65 filter.setAsyncSupported(true);
66 filter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
67 }
68 }
69 }