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.LogEvent;
25 import org.apache.logging.log4j.core.async.ThreadNameCachingStrategy;
26 import org.apache.logging.log4j.core.config.Property;
27 import org.apache.logging.log4j.core.util.Clock;
28 import org.apache.logging.log4j.core.util.ClockFactory;
29 import org.apache.logging.log4j.message.Message;
30 import org.apache.logging.log4j.message.TimestampMessage;
31
32
33
34
35
36 public class ReusableLogEventFactory implements LogEventFactory {
37 private static final ThreadNameCachingStrategy THREAD_NAME_CACHING_STRATEGY = ThreadNameCachingStrategy.create();
38 private static final Clock CLOCK = ClockFactory.getClock();
39
40 private static ThreadLocal<MutableLogEvent> mutableLogEventThreadLocal = new ThreadLocal<>();
41
42
43
44
45
46
47
48
49
50
51
52
53 @Override
54 public LogEvent createEvent(final String loggerName, final Marker marker,
55 final String fqcn, final Level level, final Message message,
56 final List<Property> properties, final Throwable t) {
57 MutableLogEvent result = mutableLogEventThreadLocal.get();
58 if (result == null) {
59 result = new MutableLogEvent();
60
61
62 result.setThreadId(Thread.currentThread().getId());
63 result.setThreadName(Thread.currentThread().getName());
64 result.setThreadPriority(Thread.currentThread().getPriority());
65 mutableLogEventThreadLocal.set(result);
66 }
67 result.clear();
68
69 result.setLoggerName(loggerName);
70 result.setMarker(marker);
71 result.setLoggerFqcn(fqcn);
72 result.setLevel(level == null ? Level.OFF : level);
73 result.setMessage(message);
74 result.setThrown(t);
75 result.setContextMap(Log4jLogEvent.createMap(properties));
76 result.setContextStack(ThreadContext.getDepth() == 0 ? null : ThreadContext.cloneStack());
77 result.setTimeMillis(message instanceof TimestampMessage
78 ? ((TimestampMessage) message).getTimestamp()
79 : CLOCK.currentTimeMillis());
80 result.setNanoTime(Log4jLogEvent.getNanoClock().nanoTime());
81
82 if (THREAD_NAME_CACHING_STRATEGY == ThreadNameCachingStrategy.UNCACHED) {
83 result.setThreadName(Thread.currentThread().getName());
84 result.setThreadPriority(Thread.currentThread().getPriority());
85 }
86 return result;
87 }
88 }