1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.pattern;
18
19 import java.util.Map;
20 import java.util.Set;
21 import java.util.TreeSet;
22
23 import org.apache.logging.log4j.core.LogEvent;
24 import org.apache.logging.log4j.core.config.plugins.Plugin;
25 import org.apache.logging.log4j.message.MapMessage;
26
27
28
29
30
31
32
33 @Plugin(name = "MapPatternConverter", category = PatternConverter.CATEGORY)
34 @ConverterKeys({ "K", "map", "MAP" })
35 public final class MapPatternConverter extends LogEventPatternConverter {
36
37
38
39 private final String key;
40
41
42
43
44
45
46 private MapPatternConverter(final String[] options) {
47 super(options != null && options.length > 0 ? "MAP{" + options[0] + '}' : "MAP", "map");
48 key = options != null && options.length > 0 ? options[0] : null;
49 }
50
51
52
53
54
55
56
57 public static MapPatternConverter newInstance(final String[] options) {
58 return new MapPatternConverter(options);
59 }
60
61
62
63
64 @Override
65 public void format(final LogEvent event, final StringBuilder toAppendTo) {
66 MapMessage msg;
67 if (event.getMessage() instanceof MapMessage) {
68 msg = (MapMessage) event.getMessage();
69 } else {
70 return;
71 }
72 final Map<String, String> map = msg.getData();
73
74
75 if (key == null) {
76 if (map.isEmpty()) {
77 toAppendTo.append("{}");
78 return;
79 }
80 final StringBuilder sb = new StringBuilder("{");
81 final Set<String> keys = new TreeSet<String>(map.keySet());
82 for (final String key : keys) {
83 if (sb.length() > 1) {
84 sb.append(", ");
85 }
86 sb.append(key).append('=').append(map.get(key));
87
88 }
89 sb.append('}');
90 toAppendTo.append(sb);
91 } else {
92
93 final String val = map.get(key);
94
95 if (val != null) {
96 toAppendTo.append(val);
97 }
98 }
99 }
100 }