1
2
3
4
5
6
7
8
9
10
11
12
13
14 package ch.qos.logback.classic.spi;
15
16 import java.util.HashMap;
17 import java.util.Map;
18
19 import org.slf4j.MDC;
20 import org.slf4j.Marker;
21 import org.slf4j.helpers.FormattingTuple;
22 import org.slf4j.helpers.MessageFormatter;
23
24 import ch.qos.logback.classic.Level;
25 import ch.qos.logback.classic.Logger;
26 import ch.qos.logback.classic.LoggerContext;
27 import ch.qos.logback.classic.util.LogbackMDCAdapter;
28 import org.slf4j.spi.MDCAdapter;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class LoggingEvent implements ILoggingEvent {
47
48
49
50
51
52
53
54
55 transient String fqnOfLoggerClass;
56
57
58
59
60 private String threadName;
61
62 private String loggerName;
63 private LoggerContext loggerContext;
64 private LoggerContextVO loggerContextVO;
65
66
67
68
69
70
71
72
73
74
75 private transient Level level;
76
77 private String message;
78
79
80
81
82 private transient String formattedMessage;
83
84 private transient Object[] argumentArray;
85
86 private ThrowableProxy throwableProxy;
87
88 private StackTraceElement[] callerDataArray;
89
90 private Marker marker;
91
92 private Map<String, String> mdcPropertyMap;
93 private static final Map<String, String> CACHED_NULL_MAP = new HashMap<String, String>();
94
95
96
97
98
99 private long timeStamp;
100
101 public LoggingEvent() {
102 }
103
104 public LoggingEvent(String fqcn, Logger logger, Level level, String message,
105 Throwable throwable, Object[] argArray) {
106 this.fqnOfLoggerClass = fqcn;
107 this.loggerName = logger.getName();
108 this.loggerContext = logger.getLoggerContext();
109 this.loggerContextVO = loggerContext.getLoggerContextRemoteView();
110 this.level = level;
111
112 this.message = message;
113
114 FormattingTuple ft = MessageFormatter.arrayFormat(message, argArray);
115 formattedMessage = ft.getMessage();
116
117 if (throwable == null) {
118 argumentArray = ft.getArgArray();
119 throwable = ft.getThrowable();
120 } else {
121 this.argumentArray = argArray;
122 }
123
124 if (throwable != null) {
125 this.throwableProxy = new ThrowableProxy(throwable);
126 LoggerContext lc = logger.getLoggerContext();
127 if (lc.isPackagingDataEnabled()) {
128 this.throwableProxy.calculatePackagingData();
129 }
130 }
131
132 timeStamp = System.currentTimeMillis();
133 }
134
135 public void setArgumentArray(Object[] argArray) {
136 if (this.argumentArray != null) {
137 throw new IllegalStateException("argArray has been already set");
138 }
139 this.argumentArray = argArray;
140 }
141
142 public Object[] getArgumentArray() {
143 return this.argumentArray;
144 }
145
146 public Level getLevel() {
147 return level;
148 }
149
150 public String getLoggerName() {
151 return loggerName;
152 }
153
154 public void setLoggerName(String loggerName) {
155 this.loggerName = loggerName;
156 }
157
158 public String getThreadName() {
159 if (threadName == null) {
160 threadName = (Thread.currentThread()).getName();
161 }
162 return threadName;
163 }
164
165
166
167
168
169
170
171 public void setThreadName(String threadName) throws IllegalStateException {
172 if (this.threadName != null) {
173 throw new IllegalStateException("threadName has been already set");
174 }
175 this.threadName = threadName;
176 }
177
178
179
180
181
182 public IThrowableProxy getThrowableProxy() {
183 return throwableProxy;
184 }
185
186
187
188
189 public void setThrowableProxy(ThrowableProxy tp) {
190 if (throwableProxy != null) {
191 throw new IllegalStateException("ThrowableProxy has been already set.");
192 } else {
193 throwableProxy = tp;
194 }
195 }
196
197
198
199
200
201
202
203
204
205 public void prepareForDeferredProcessing() {
206 this.getFormattedMessage();
207 this.getThreadName();
208
209 this.getMDCPropertyMap();
210 }
211
212 public LoggerContextVO getLoggerContextVO() {
213 return loggerContextVO;
214 }
215
216 public void setLoggerContextRemoteView(LoggerContextVO loggerContextVO) {
217 this.loggerContextVO = loggerContextVO;
218 }
219
220 public String getMessage() {
221 return message;
222 }
223
224 public void setMessage(String message) {
225 if (this.message != null) {
226 throw new IllegalStateException(
227 "The message for this event has been set already.");
228 }
229 this.message = message;
230 }
231
232 public long getTimeStamp() {
233 return timeStamp;
234 }
235
236 public void setTimeStamp(long timeStamp) {
237 this.timeStamp = timeStamp;
238 }
239
240 public void setLevel(Level level) {
241 if (this.level != null) {
242 throw new IllegalStateException(
243 "The level has been already set for this event.");
244 }
245 this.level = level;
246 }
247
248
249
250
251
252
253
254
255
256
257
258 public StackTraceElement[] getCallerData() {
259 if (callerDataArray == null) {
260 callerDataArray = CallerData.extract(new Throwable(), fqnOfLoggerClass,
261 loggerContext.getMaxCallerDataDepth());
262 }
263 return callerDataArray;
264 }
265
266 public boolean hasCallerData() {
267 return (callerDataArray != null);
268 }
269
270 public void setCallerData(StackTraceElement[] callerDataArray) {
271 this.callerDataArray = callerDataArray;
272 }
273
274 public Marker getMarker() {
275 return marker;
276 }
277
278 public void setMarker(Marker marker) {
279 if (this.marker != null) {
280 throw new IllegalStateException(
281 "The marker has been already set for this event.");
282 }
283 this.marker = marker;
284 }
285
286 public long getContextBirthTime() {
287 return loggerContextVO.getBirthTime();
288 }
289
290
291
292 public String getFormattedMessage() {
293 if (formattedMessage != null) {
294 return formattedMessage;
295 }
296 if (argumentArray != null) {
297 formattedMessage = MessageFormatter.arrayFormat(message, argumentArray)
298 .getMessage();
299 } else {
300 formattedMessage = message;
301 }
302
303 return formattedMessage;
304 }
305
306 public Map<String, String> getMDCPropertyMap() {
307
308 if (mdcPropertyMap == null) {
309 MDCAdapter mdc = MDC.getMDCAdapter();
310 if (mdc instanceof LogbackMDCAdapter)
311 mdcPropertyMap = ((LogbackMDCAdapter)mdc).getPropertyMap();
312 else
313 mdcPropertyMap = mdc.getCopyOfContextMap();
314 }
315
316 if (mdcPropertyMap == null)
317 mdcPropertyMap = CACHED_NULL_MAP;
318
319 return mdcPropertyMap;
320 }
321
322
323
324
325
326 public Map<String, String> getMdc() {
327 return getMDCPropertyMap();
328 }
329
330 @Override
331 public String toString() {
332 StringBuilder sb = new StringBuilder();
333 sb.append('[');
334 sb.append(level).append("] ");
335 sb.append(getFormattedMessage());
336 return sb.toString();
337 }
338
339 }