1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.slf4j.ext;
26
27 import org.slf4j.Logger;
28 import org.slf4j.Marker;
29 import org.slf4j.MarkerFactory;
30 import org.slf4j.helpers.FormattingTuple;
31 import org.slf4j.helpers.MessageFormatter;
32 import org.slf4j.spi.LocationAwareLogger;
33
34
35
36
37
38
39
40
41 public class XLogger extends LoggerWrapper implements Logger {
42
43 private static final String FQCN = XLogger.class.getName();
44 static Marker FLOW_MARKER = MarkerFactory.getMarker("FLOW");
45 static Marker ENTRY_MARKER = MarkerFactory.getMarker("ENTRY");
46 static Marker EXIT_MARKER = MarkerFactory.getMarker("EXIT");
47
48 static Marker EXCEPTION_MARKER = MarkerFactory.getMarker("EXCEPTION");
49 static Marker THROWING_MARKER = MarkerFactory.getMarker("THROWING");
50 static Marker CATCHING_MARKER = MarkerFactory.getMarker("CATCHING");
51
52 static String EXIT_MESSAGE_0 = "exit";
53 static String EXIT_MESSAGE_1 = "exit with ({})";
54
55 static String ENTRY_MESSAGE_0 = "entry";
56 static String ENTRY_MESSAGE_1 = "entry with ({})";
57 static String ENTRY_MESSAGE_2 = "entry with ({}, {})";
58 static String ENTRY_MESSAGE_3 = "entry with ({}, {}, {})";
59 static String ENTRY_MESSAGE_4 = "entry with ({}, {}, {}, {})";
60 static int ENTRY_MESSAGE_ARRAY_LEN = 5;
61 static String[] ENTRY_MESSAGE_ARRAY = new String[ENTRY_MESSAGE_ARRAY_LEN];
62 static {
63 ENTRY_MARKER.add(FLOW_MARKER);
64 EXIT_MARKER.add(FLOW_MARKER);
65 THROWING_MARKER.add(EXCEPTION_MARKER);
66 CATCHING_MARKER.add(EXCEPTION_MARKER);
67
68 ENTRY_MESSAGE_ARRAY[0] = ENTRY_MESSAGE_0;
69 ENTRY_MESSAGE_ARRAY[1] = ENTRY_MESSAGE_1;
70 ENTRY_MESSAGE_ARRAY[2] = ENTRY_MESSAGE_2;
71 ENTRY_MESSAGE_ARRAY[3] = ENTRY_MESSAGE_3;
72 ENTRY_MESSAGE_ARRAY[4] = ENTRY_MESSAGE_4;
73 }
74
75 public enum Level {
76 TRACE("TRACE", LocationAwareLogger.TRACE_INT), DEBUG("DEBUG",
77 LocationAwareLogger.DEBUG_INT), INFO("INFO",
78 LocationAwareLogger.INFO_INT), WARN("WARN",
79 LocationAwareLogger.WARN_INT), ERROR("ERROR",
80 LocationAwareLogger.ERROR_INT);
81
82 private final String name;
83 private final int level;
84
85 public String toString() {
86 return this.name;
87 }
88
89 public int intValue() {
90 return this.level;
91 }
92
93 private Level(String name, int level) {
94 this.name = name;
95 this.level = level;
96 }
97 }
98
99
100
101
102
103
104
105 public XLogger(Logger logger) {
106
107
108
109 super(logger, LoggerWrapper.class.getName());
110 }
111
112
113
114
115
116
117
118 public void entry(Object... argArray) {
119 if (instanceofLAL && logger.isTraceEnabled(ENTRY_MARKER)) {
120 String messagePattern = null;
121 if (argArray.length < ENTRY_MESSAGE_ARRAY_LEN) {
122 messagePattern = ENTRY_MESSAGE_ARRAY[argArray.length];
123 } else {
124 messagePattern = buildMessagePattern(argArray.length);
125 }
126 FormattingTuple tp = MessageFormatter.arrayFormat(messagePattern, argArray);
127 ((LocationAwareLogger) logger).log(ENTRY_MARKER, FQCN,
128 LocationAwareLogger.TRACE_INT, tp.getMessage(), argArray, tp.getThrowable());
129 }
130 }
131
132
133
134
135 public void exit() {
136 if (instanceofLAL && logger.isTraceEnabled(ENTRY_MARKER)) {
137 ((LocationAwareLogger) logger).log(EXIT_MARKER, FQCN,
138 LocationAwareLogger.TRACE_INT, EXIT_MESSAGE_0, null, null);
139 }
140 }
141
142
143
144
145
146
147
148 public void exit(Object result) {
149 if (instanceofLAL && logger.isTraceEnabled(ENTRY_MARKER)) {
150 FormattingTuple tp = MessageFormatter.format(EXIT_MESSAGE_1, result);
151 ((LocationAwareLogger) logger).log(EXIT_MARKER, FQCN,
152 LocationAwareLogger.TRACE_INT, tp.getMessage(),
153 new Object[] { result }, tp.getThrowable());
154 }
155 }
156
157
158
159
160
161
162
163 public void throwing(Throwable throwable) {
164 if (instanceofLAL) {
165 ((LocationAwareLogger) logger).log(THROWING_MARKER, FQCN,
166 LocationAwareLogger.ERROR_INT, "throwing", null, throwable);
167 }
168 }
169
170
171
172
173
174
175
176
177
178 public void throwing(Level level, Throwable throwable) {
179 if (instanceofLAL) {
180 ((LocationAwareLogger) logger).log(THROWING_MARKER, FQCN, level.level,
181 "throwing", null, throwable);
182 }
183 }
184
185
186
187
188
189
190
191 public void catching(Throwable throwable) {
192 if (instanceofLAL) {
193 ((LocationAwareLogger) logger).log(CATCHING_MARKER, FQCN,
194 LocationAwareLogger.ERROR_INT, "catching", null, throwable);
195 }
196 }
197
198
199
200
201
202
203
204
205
206 public void catching(Level level, Throwable throwable) {
207 if (instanceofLAL) {
208 ((LocationAwareLogger) logger).log(CATCHING_MARKER, FQCN, level.level,
209 "catching", null, throwable);
210 }
211 }
212
213 private static String buildMessagePattern(int len) {
214 StringBuilder sb = new StringBuilder();
215 sb.append(" entry with (");
216 for (int i = 0; i < len; i++) {
217 sb.append("{}");
218 if (i != len - 1)
219 sb.append(", ");
220 }
221 sb.append(')');
222 return sb.toString();
223 }
224 }