1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.util;
21
22 import java.util.Arrays;
23 import java.util.Map;
24 import java.util.Set;
25 import java.util.logging.Formatter;
26 import java.util.logging.LogRecord;
27
28 import org.slf4j.MDC;
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class Log4jXmlFormatter extends Formatter {
48
49 private static final int DEFAULT_SIZE = 256;
50
51 private static final int UPPER_LIMIT = 2048;
52
53 private StringBuilder buf = new StringBuilder(DEFAULT_SIZE);
54
55 private boolean locationInfo = false;
56
57 private boolean properties = false;
58
59
60
61
62
63
64
65
66
67
68 public void setLocationInfo(boolean flag) {
69 locationInfo = flag;
70 }
71
72
73
74
75 public boolean getLocationInfo() {
76 return locationInfo;
77 }
78
79
80
81
82
83
84 public void setProperties(final boolean flag) {
85 properties = flag;
86 }
87
88
89
90
91
92
93 public boolean getProperties() {
94 return properties;
95 }
96
97 @Override
98 public String format(final LogRecord record) {
99
100
101 if (buf.capacity() > UPPER_LIMIT) {
102 buf = new StringBuilder(DEFAULT_SIZE);
103 } else {
104 buf.setLength(0);
105 }
106
107 buf.append("<log4j:event logger=\"");
108 buf.append(Transform.escapeTags(record.getLoggerName()));
109 buf.append("\" timestamp=\"");
110 buf.append(record.getMillis());
111 buf.append("\" level=\"");
112
113 buf.append(Transform.escapeTags(record.getLevel().getName()));
114 buf.append("\" thread=\"");
115 buf.append(String.valueOf(record.getThreadID()));
116 buf.append("\">\r\n");
117
118 buf.append("<log4j:message><![CDATA[");
119
120
121 Transform.appendEscapingCDATA(buf, record.getMessage());
122 buf.append("]]></log4j:message>\r\n");
123
124 if (record.getThrown() != null) {
125 String[] s = Transform.getThrowableStrRep(record.getThrown());
126
127 if (s != null) {
128 buf.append("<log4j:throwable><![CDATA[");
129
130 for (String value : s) {
131 Transform.appendEscapingCDATA(buf, value);
132 buf.append("\r\n");
133 }
134
135 buf.append("]]></log4j:throwable>\r\n");
136 }
137 }
138
139 if (locationInfo) {
140 buf.append("<log4j:locationInfo class=\"");
141 buf.append(Transform.escapeTags(record.getSourceClassName()));
142 buf.append("\" method=\"");
143 buf.append(Transform.escapeTags(record.getSourceMethodName()));
144 buf.append("\" file=\"?\" line=\"?\"/>\r\n");
145 }
146
147 if (properties) {
148 Map<String,String> contextMap = MDC.getCopyOfContextMap();
149
150 if (contextMap != null) {
151 Set<String> keySet = contextMap.keySet();
152
153 if ((keySet != null) && !keySet.isEmpty()) {
154 buf.append("<log4j:properties>\r\n");
155 Object[] keys = keySet.toArray();
156 Arrays.sort(keys);
157
158 for (Object key1 : keys) {
159 String key = key1 == null ? "" : key1.toString();
160 Object val = contextMap.get(key);
161
162 if (val != null) {
163 buf.append("<log4j:data name=\"");
164 buf.append(Transform.escapeTags(key));
165 buf.append("\" value=\"");
166 buf.append(Transform.escapeTags(String.valueOf(val)));
167 buf.append("\"/>\r\n");
168 }
169 }
170
171 buf.append("</log4j:properties>\r\n");
172 }
173 }
174 }
175
176 buf.append("</log4j:event>\r\n\r\n");
177
178 return buf.toString();
179 }
180 }