1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.log4j.rewrite;
18
19 import org.apache.log4j.bridge.LogEventAdapter;
20 import org.apache.log4j.helpers.OptionConverter;
21 import org.apache.log4j.spi.LocationInfo;
22 import org.apache.log4j.spi.LoggingEvent;
23 import org.apache.logging.log4j.core.LogEvent;
24 import org.apache.logging.log4j.core.impl.Log4jLogEvent;
25 import org.apache.logging.log4j.message.SimpleMessage;
26 import org.apache.logging.log4j.util.SortedArrayStringMap;
27
28 import java.util.Collections;
29 import java.util.HashMap;
30 import java.util.Map;
31 import java.util.StringTokenizer;
32
33
34
35
36
37
38
39
40
41
42 public class PropertyRewritePolicy implements RewritePolicy {
43 private Map<String, String> properties = Collections.EMPTY_MAP;
44
45 public PropertyRewritePolicy() {
46 }
47
48
49
50
51
52
53
54
55 public void setProperties(String props) {
56 Map hashTable = new HashMap();
57 StringTokenizer pairs = new StringTokenizer(props, ",");
58 while (pairs.hasMoreTokens()) {
59 StringTokenizer entry = new StringTokenizer(pairs.nextToken(), "=");
60 hashTable.put(entry.nextElement().toString().trim(), entry.nextElement().toString().trim());
61 }
62 synchronized (this) {
63 properties = hashTable;
64 }
65 }
66
67
68
69
70 public LoggingEvent rewrite(final LoggingEvent source) {
71 if (!properties.isEmpty()) {
72 Map<String, String> rewriteProps = source.getProperties() != null ? new HashMap<>(source.getProperties())
73 : new HashMap<>();
74 for (Map.Entry<String, String> entry : properties.entrySet()) {
75 if (!rewriteProps.containsKey(entry.getKey())) {
76 rewriteProps.put(entry.getKey(), entry.getValue());
77 }
78 }
79 LogEvent event;
80 if (source instanceof LogEventAdapter) {
81 event = new Log4jLogEvent.Builder(((LogEventAdapter) source).getEvent())
82 .setContextData(new SortedArrayStringMap(rewriteProps))
83 .build();
84 } else {
85 LocationInfo info = source.getLocationInformation();
86 StackTraceElement element = new StackTraceElement(info.getClassName(), info.getMethodName(),
87 info.getFileName(), Integer.parseInt(info.getLineNumber()));
88 Thread thread = getThread(source.getThreadName());
89 long threadId = thread != null ? thread.getId() : 0;
90 int threadPriority = thread != null ? thread.getPriority() : 0;
91 event = Log4jLogEvent.newBuilder()
92 .setContextData(new SortedArrayStringMap(rewriteProps))
93 .setLevel(OptionConverter.convertLevel(source.getLevel()))
94 .setLoggerFqcn(source.getFQNOfLoggerClass())
95 .setMarker(null)
96 .setMessage(new SimpleMessage(source.getRenderedMessage()))
97 .setSource(element)
98 .setLoggerName(source.getLoggerName())
99 .setThreadName(source.getThreadName())
100 .setThreadId(threadId)
101 .setThreadPriority(threadPriority)
102 .setThrown(source.getThrowableInformation().getThrowable())
103 .setTimeMillis(source.getTimeStamp())
104 .setNanoTime(0)
105 .setThrownProxy(null)
106 .build();
107 }
108 return new LogEventAdapter(event);
109 }
110 return source;
111 }
112
113 private Thread getThread(String name) {
114 for (Thread thread : Thread.getAllStackTraces().keySet()) {
115 if (thread.getName().equals(name)) {
116 return thread;
117 }
118 }
119 return null;
120 }
121 }