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.Locale;
20 import java.util.concurrent.TimeUnit;
21
22 import javax.servlet.ServletContext;
23 import javax.servlet.ServletContextEvent;
24 import javax.servlet.ServletContextListener;
25
26 import org.apache.logging.log4j.Logger;
27 import org.apache.logging.log4j.core.LifeCycle2;
28 import org.apache.logging.log4j.status.StatusLogger;
29 import org.apache.logging.log4j.util.Strings;
30
31
32
33
34
35
36 public class Log4jServletContextListener implements ServletContextListener {
37
38 private static final int DEFAULT_STOP_TIMEOUT = 30;
39 private static final TimeUnit DEFAULT_STOP_TIMEOUT_TIMEUNIT = TimeUnit.SECONDS;
40
41 private static final String KEY_STOP_TIMEOUT = "log4j.stop.timeout";
42 private static final String KEY_STOP_TIMEOUT_TIMEUNIT = "log4j.stop.timeout.timeunit";
43
44 private static final Logger LOGGER = StatusLogger.getLogger();
45
46 private ServletContext servletContext;
47 private Log4jWebLifeCycle initializer;
48
49 @Override
50 public void contextInitialized(final ServletContextEvent event) {
51 this.servletContext = event.getServletContext();
52 LOGGER.debug("Log4jServletContextListener ensuring that Log4j starts up properly.");
53
54 this.initializer = WebLoggerContextUtils.getWebLifeCycle(this.servletContext);
55 try {
56 this.initializer.start();
57 this.initializer.setLoggerContext();
58 } catch (final IllegalStateException e) {
59 throw new IllegalStateException("Failed to initialize Log4j properly.", e);
60 }
61 }
62
63 @Override
64 public void contextDestroyed(final ServletContextEvent event) {
65 if (this.servletContext == null || this.initializer == null) {
66 LOGGER.warn("Context destroyed before it was initialized.");
67 return;
68 }
69 LOGGER.debug("Log4jServletContextListener ensuring that Log4j shuts down properly.");
70
71 this.initializer.clearLoggerContext();
72
73 if (initializer instanceof LifeCycle2) {
74 final String stopTimeoutStr = servletContext.getInitParameter(KEY_STOP_TIMEOUT);
75 final long stopTimeout = Strings.isEmpty(stopTimeoutStr) ? DEFAULT_STOP_TIMEOUT
76 : Long.parseLong(stopTimeoutStr);
77 final String timeoutTimeUnitStr = servletContext.getInitParameter(KEY_STOP_TIMEOUT_TIMEUNIT);
78 final TimeUnit timeoutTimeUnit = Strings.isEmpty(timeoutTimeUnitStr) ? DEFAULT_STOP_TIMEOUT_TIMEUNIT
79 : TimeUnit.valueOf(timeoutTimeUnitStr.toUpperCase(Locale.ROOT));
80 ((LifeCycle2) this.initializer).stop(stopTimeout, timeoutTimeUnit);
81 } else {
82 this.initializer.stop();
83 }
84 }
85 }