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