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.AbstractMap;
20 import java.util.Map;
21 import java.util.concurrent.locks.Lock;
22 import java.util.concurrent.locks.ReentrantLock;
23 import jakarta.servlet.ServletContext;
24
25 import org.apache.logging.log4j.LogManager;
26 import org.apache.logging.log4j.core.LoggerContext;
27 import org.apache.logging.log4j.core.impl.ContextAnchor;
28
29
30
31
32
33
34
35
36
37 public final class WebLoggerContextUtils {
38 private WebLoggerContextUtils() {
39 }
40
41 private static final Lock WEB_SUPPORT_LOOKUP = new ReentrantLock();
42 private static final String SERVLET_CONTEXT = "__SERVLET_CONTEXT__";
43
44
45
46
47
48
49
50
51 public static LoggerContext getWebLoggerContext(final ServletContext servletContext) {
52 return (LoggerContext) servletContext.getAttribute(Log4jWebSupport.CONTEXT_ATTRIBUTE);
53 }
54
55
56
57
58
59
60
61
62
63 public static LoggerContext getRequiredWebLoggerContext(final ServletContext servletContext) {
64 final LoggerContext loggerContext = getWebLoggerContext(servletContext);
65 if (loggerContext == null) {
66 throw new IllegalStateException(
67 "No LoggerContext found in ServletContext attribute " + Log4jWebSupport.CONTEXT_ATTRIBUTE);
68 }
69 return loggerContext;
70 }
71
72
73
74
75
76
77
78
79
80 public static Log4jWebLifeCycle getWebLifeCycle(final ServletContext servletContext) {
81 WEB_SUPPORT_LOOKUP.lock();
82 try {
83 Log4jWebLifeCycle webLifeCycle = (Log4jWebLifeCycle) servletContext.getAttribute(
84 Log4jWebSupport.SUPPORT_ATTRIBUTE);
85 if (webLifeCycle == null) {
86 webLifeCycle = Log4jWebInitializerImpl.initialize(servletContext);
87 }
88 return webLifeCycle;
89 } finally {
90 WEB_SUPPORT_LOOKUP.unlock();
91 }
92 }
93
94
95
96
97
98
99
100
101
102
103 public static Runnable wrapExecutionContext(final ServletContext servletContext, final Runnable runnable) {
104 return () -> {
105 final Log4jWebSupport webSupport = getWebLifeCycle(servletContext);
106 webSupport.setLoggerContext();
107 try {
108 runnable.run();
109 } finally {
110 webSupport.clearLoggerContext();
111 }
112 };
113 }
114
115 public static Map.Entry<String, Object> createExternalEntry(ServletContext servletContext) {
116 return new AbstractMap.SimpleEntry<>(SERVLET_CONTEXT, servletContext);
117 }
118
119 public static void setServletContext(LoggerContext lc, ServletContext servletContext) {
120 if (lc != null) {
121 lc.putObject(SERVLET_CONTEXT, servletContext);
122 }
123 }
124
125
126
127
128
129
130
131 public static ServletContext getServletContext() {
132 org.apache.logging.log4j.spi.LoggerContext lc = ContextAnchor.THREAD_CONTEXT.get();
133 if (lc == null) {
134 lc = LogManager.getContext(false);
135 }
136
137 Object obj = lc != null ? lc.getObject(SERVLET_CONTEXT) : null;
138 if (obj instanceof ServletContext) {
139 return (ServletContext) obj;
140 }
141 return null;
142 }
143 }