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", LocationAwareLogger.DEBUG_INT), INFO("INFO", LocationAwareLogger.INFO_INT), WARN("WARN",
77 LocationAwareLogger.WARN_INT), ERROR("ERROR", LocationAwareLogger.ERROR_INT);
78
79 private final String name;
80 private final int level;
81
82 public String toString() {
83 return this.name;
84 }
85
86 public int intValue() {
87 return this.level;
88 }
89
90 private Level(String name, int level) {
91 this.name = name;
92 this.level = level;
93 }
94 }
95
96
97
98
99
100
101
102 public XLogger(Logger logger) {
103
104
105
106 super(logger, LoggerWrapper.class.getName());
107 }
108
109
110
111
112
113
114
115 public void entry(Object... argArray) {
116 if (instanceofLAL && logger.isTraceEnabled(ENTRY_MARKER)) {
117 String messagePattern = null;
118 if (argArray.length < ENTRY_MESSAGE_ARRAY_LEN) {
119 messagePattern = ENTRY_MESSAGE_ARRAY[argArray.length];
120 } else {
121 messagePattern = buildMessagePattern(argArray.length);
122 }
123 FormattingTuple tp = MessageFormatter.arrayFormat(messagePattern, argArray);
124 ((LocationAwareLogger) logger).log(ENTRY_MARKER, FQCN, LocationAwareLogger.TRACE_INT, tp.getMessage(), argArray, tp.getThrowable());
125 }
126 }
127
128
129
130
131 public void exit() {
132 if (instanceofLAL && logger.isTraceEnabled(ENTRY_MARKER)) {
133 ((LocationAwareLogger) logger).log(EXIT_MARKER, FQCN, LocationAwareLogger.TRACE_INT, EXIT_MESSAGE_0, null, null);
134 }
135 }
136
137
138
139
140
141
142
143 public <T> T exit(T result) {
144 if (instanceofLAL && logger.isTraceEnabled(ENTRY_MARKER)) {
145 FormattingTuple tp = MessageFormatter.format(EXIT_MESSAGE_1, result);
146 ((LocationAwareLogger) logger).log(EXIT_MARKER, FQCN, LocationAwareLogger.TRACE_INT, tp.getMessage(), new Object[] { result }, tp.getThrowable());
147 }
148 return result;
149 }
150
151
152
153
154
155
156
157 public <T extends Throwable> T throwing(T throwable) {
158 if (instanceofLAL) {
159 ((LocationAwareLogger) logger).log(THROWING_MARKER, FQCN, LocationAwareLogger.ERROR_INT, "throwing", null, throwable);
160 }
161 return throwable;
162 }
163
164
165
166
167
168
169
170
171
172 public <T extends Throwable> T throwing(Level level, T throwable) {
173 if (instanceofLAL) {
174 ((LocationAwareLogger) logger).log(THROWING_MARKER, FQCN, level.level, "throwing", null, throwable);
175 }
176 return throwable;
177 }
178
179
180
181
182
183
184
185 public void catching(Throwable throwable) {
186 if (instanceofLAL) {
187 ((LocationAwareLogger) logger).log(CATCHING_MARKER, FQCN, LocationAwareLogger.ERROR_INT, "catching", null, throwable);
188 }
189 }
190
191
192
193
194
195
196
197
198
199 public void catching(Level level, Throwable throwable) {
200 if (instanceofLAL) {
201 ((LocationAwareLogger) logger).log(CATCHING_MARKER, FQCN, level.level, "catching", null, throwable);
202 }
203 }
204
205 private static String buildMessagePattern(int len) {
206 StringBuilder sb = new StringBuilder();
207 sb.append(" entry with (");
208 for (int i = 0; i < len; i++) {
209 sb.append("{}");
210 if (i != len - 1)
211 sb.append(", ");
212 }
213 sb.append(')');
214 return sb.toString();
215 }
216 }