1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.impl;
18
19 import java.util.List;
20
21 import org.apache.logging.log4j.Level;
22 import org.apache.logging.log4j.Marker;
23 import org.apache.logging.log4j.ThreadContext;
24 import org.apache.logging.log4j.core.ContextDataInjector;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.async.ThreadNameCachingStrategy;
27 import org.apache.logging.log4j.core.config.Property;
28 import org.apache.logging.log4j.core.util.Clock;
29 import org.apache.logging.log4j.core.util.ClockFactory;
30 import org.apache.logging.log4j.message.Message;
31 import org.apache.logging.log4j.util.StringMap;
32
33
34
35
36
37 public class ReusableLogEventFactory implements LogEventFactory {
38 private static final ThreadNameCachingStrategy THREAD_NAME_CACHING_STRATEGY = ThreadNameCachingStrategy.create();
39 private static final Clock CLOCK = ClockFactory.getClock();
40
41 private static ThreadLocal<MutableLogEvent> mutableLogEventThreadLocal = new ThreadLocal<>();
42 private final ContextDataInjector injector = ContextDataInjectorFactory.createInjector();
43
44
45
46
47
48
49
50
51
52
53
54
55
56 @Override
57 public LogEvent createEvent(final String loggerName, final Marker marker,
58 final String fqcn, final Level level, final Message message,
59 final List<Property> properties, final Throwable t) {
60 MutableLogEvent result = mutableLogEventThreadLocal.get();
61 if (result == null || result.reserved) {
62 final boolean initThreadLocal = result == null;
63 result = new MutableLogEvent();
64
65
66 result.setThreadId(Thread.currentThread().getId());
67 result.setThreadName(Thread.currentThread().getName());
68 result.setThreadPriority(Thread.currentThread().getPriority());
69 if (initThreadLocal) {
70 mutableLogEventThreadLocal.set(result);
71 }
72 }
73 result.reserved = true;
74 result.clear();
75
76 result.setLoggerName(loggerName);
77 result.setMarker(marker);
78 result.setLoggerFqcn(fqcn);
79 result.setLevel(level == null ? Level.OFF : level);
80 result.setMessage(message);
81 result.initTime(CLOCK, Log4jLogEvent.getNanoClock());
82 result.setThrown(t);
83 result.setContextData(injector.injectContextData(properties, (StringMap) result.getContextData()));
84 result.setContextStack(ThreadContext.getDepth() == 0 ? ThreadContext.EMPTY_STACK : ThreadContext.cloneStack());
85
86 if (THREAD_NAME_CACHING_STRATEGY == ThreadNameCachingStrategy.UNCACHED) {
87 result.setThreadName(Thread.currentThread().getName());
88 result.setThreadPriority(Thread.currentThread().getPriority());
89 }
90 return result;
91 }
92
93
94
95
96
97
98
99 public static void release(final LogEvent logEvent) {
100 if (logEvent instanceof MutableLogEvent) {
101 ((MutableLogEvent) logEvent).reserved = false;
102 }
103 }
104 }