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
26 package org.slf4j.impl;
27
28 import java.io.InputStream;
29 import java.security.AccessController;
30 import java.security.PrivilegedAction;
31 import java.text.DateFormat;
32 import java.text.SimpleDateFormat;
33 import java.util.Date;
34 import java.util.Properties;
35
36 import org.slf4j.Logger;
37 import org.slf4j.helpers.FormattingTuple;
38 import org.slf4j.helpers.MarkerIgnoringBase;
39 import org.slf4j.helpers.MessageFormatter;
40 import org.slf4j.helpers.Util;
41 import org.slf4j.spi.LocationAwareLogger;
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 public class SimpleLogger extends MarkerIgnoringBase {
112
113 private static final long serialVersionUID = -632788891211436180L;
114
115
116
117
118 private static long startTime = System.currentTimeMillis();
119
120 private static final String CONFIGURATION_FILE = "simplelogger.properties";
121
122
123 private static final String systemPrefix = "org.slf4j.simplelogger.";
124
125
126 private static final Properties simpleLoggerProps = new Properties();
127
128
129 private static final String DEFAULT_DATE_TIME_FORMAT =
130 "yyyy-MM-dd HH:mm:ss:SSS Z";
131
132
133 private static boolean showLogName = true;
134
135
136
137
138 private static boolean showShortName = false;
139
140 private static boolean showDateTime = false;
141
142 private static String dateTimeFormat = DEFAULT_DATE_TIME_FORMAT;
143
144
145 private static boolean showThreadName = true;
146
147
148
149
150
151
152
153
154
155 private static DateFormat dateFormatter = null;
156
157
158 public static final int LOG_LEVEL_TRACE = LocationAwareLogger.TRACE_INT;
159
160 public static final int LOG_LEVEL_DEBUG = LocationAwareLogger.DEBUG_INT;
161
162 public static final int LOG_LEVEL_INFO = LocationAwareLogger.INFO_INT;
163
164 public static final int LOG_LEVEL_WARN = LocationAwareLogger.WARN_INT;
165
166 public static final int LOG_LEVEL_ERROR = LocationAwareLogger.ERROR_INT;
167
168
169
170
171 public static final int LOG_LEVEL_ALL = (LOG_LEVEL_TRACE - 10);
172
173
174 public static final int LOG_LEVEL_OFF = (LOG_LEVEL_ERROR + 10);
175
176
177 private static String getStringProperty(String name) {
178 String prop = null;
179 try {
180 prop = System.getProperty(name);
181 } catch (SecurityException e) {
182 ;
183 }
184 return (prop == null) ? simpleLoggerProps.getProperty(name) : prop;
185 }
186
187 private static String getStringProperty(String name, String defaultValue) {
188 String prop = getStringProperty(name);
189 return (prop == null) ? defaultValue : prop;
190 }
191
192 private static boolean getBooleanProperty(String name, boolean defaultValue) {
193 String prop = getStringProperty(name);
194 return (prop == null) ? defaultValue : "true".equalsIgnoreCase(prop);
195 }
196
197
198
199
200 static {
201
202 InputStream in = (InputStream)AccessController.doPrivileged(
203 new PrivilegedAction() {
204 public Object run() {
205 ClassLoader threadCL = Thread.currentThread().getContextClassLoader();
206 if (threadCL != null) {
207 return threadCL.getResourceAsStream(CONFIGURATION_FILE);
208 } else {
209 return ClassLoader.getSystemResourceAsStream(CONFIGURATION_FILE);
210 }
211 }
212 });
213 if(null != in) {
214 try {
215 simpleLoggerProps.load(in);
216 in.close();
217 } catch(java.io.IOException e) {
218
219 }
220 }
221
222 showLogName = getBooleanProperty(systemPrefix + "showlogname", showLogName);
223 showShortName = getBooleanProperty(systemPrefix + "showShortLogname", showShortName);
224 showDateTime = getBooleanProperty(systemPrefix + "showdatetime", showDateTime);
225 showThreadName = getBooleanProperty(systemPrefix + "showthreadname", showThreadName);
226 dateTimeFormat = getStringProperty(systemPrefix + "dateTimeFormat", dateTimeFormat);
227
228 if(showDateTime) {
229 try {
230 dateFormatter = new SimpleDateFormat(dateTimeFormat);
231 } catch(IllegalArgumentException e) {
232 Util.report("Bad date format in " + CONFIGURATION_FILE + "; reverting to default", e);
233
234 dateTimeFormat = DEFAULT_DATE_TIME_FORMAT;
235 dateFormatter = new SimpleDateFormat(dateTimeFormat);
236 }
237 }
238 }
239
240
241
242
243
244 protected int currentLogLevel = LOG_LEVEL_INFO;
245
246 private transient String shortLogName = null;
247
248
249
250
251
252 SimpleLogger(String name) {
253 this.name = name;
254
255
256 this.currentLogLevel = LOG_LEVEL_INFO;
257
258
259 String lvl = getStringProperty(systemPrefix + "log." + name);
260 int i = String.valueOf(name).lastIndexOf(".");
261 while(null == lvl && i > -1) {
262 name = name.substring(0,i);
263 lvl = getStringProperty(systemPrefix + "log." + name);
264 i = String.valueOf(name).lastIndexOf(".");
265 }
266
267 if(null == lvl) {
268 lvl = getStringProperty(systemPrefix + "defaultlog");
269 }
270
271 if("all".equalsIgnoreCase(lvl)) {
272 this.currentLogLevel = LOG_LEVEL_ALL;
273 } else if("trace".equalsIgnoreCase(lvl)) {
274 this.currentLogLevel = LOG_LEVEL_TRACE;
275 } else if("debug".equalsIgnoreCase(lvl)) {
276 this.currentLogLevel = LOG_LEVEL_DEBUG;
277 } else if("info".equalsIgnoreCase(lvl)) {
278 this.currentLogLevel = LOG_LEVEL_INFO;
279 } else if("warn".equalsIgnoreCase(lvl)) {
280 this.currentLogLevel = LOG_LEVEL_WARN;
281 } else if("error".equalsIgnoreCase(lvl)) {
282 this.currentLogLevel = LOG_LEVEL_ERROR;
283
284
285 } else if("off".equalsIgnoreCase(lvl)) {
286 this.currentLogLevel = LOG_LEVEL_OFF;
287 }
288 }
289
290
291
292
293
294
295
296
297
298
299 private void log(int level, String message, Throwable t) {
300 if (! isLevelEnabled(level)) {
301 return;
302 }
303
304 StringBuffer buf = new StringBuffer(32);
305
306
307 if(showDateTime) {
308 Date now = new Date();
309 String dateText;
310 synchronized(dateFormatter) {
311 dateText = dateFormatter.format(now);
312 }
313 buf.append(dateText);
314 buf.append(' ');
315 } else {
316 buf.append(System.currentTimeMillis() - startTime);
317 buf.append(' ');
318 }
319
320
321 if (showThreadName) {
322 buf.append('[');
323 buf.append(Thread.currentThread().getName());
324 buf.append("] ");
325 }
326
327
328 switch(level) {
329 case LOG_LEVEL_TRACE: buf.append("TRACE"); break;
330 case LOG_LEVEL_DEBUG: buf.append("DEBUG"); break;
331 case LOG_LEVEL_INFO: buf.append("INFO"); break;
332 case LOG_LEVEL_WARN: buf.append("WARN"); break;
333 case LOG_LEVEL_ERROR: buf.append("ERROR"); break;
334
335 }
336 buf.append(' ');
337
338
339 if(showShortName) {
340 if(shortLogName==null) {
341
342 shortLogName = name.substring(name.lastIndexOf(".") + 1);
343 shortLogName =
344 shortLogName.substring(shortLogName.lastIndexOf("/") + 1);
345 }
346 buf.append(String.valueOf(shortLogName)).append(" - ");
347 } else if(showLogName) {
348 buf.append(String.valueOf(name)).append(" - ");
349 }
350
351
352 buf.append(message);
353
354 System.err.println(buf.toString());
355
356 if (t != null) {
357 t.printStackTrace(System.err);
358 }
359 System.err.flush();
360 }
361
362
363
364
365
366
367
368
369
370 private void formatAndLog(int level, String format, Object arg1,
371 Object arg2) {
372 if (! isLevelEnabled(level)) {
373 return;
374 }
375 FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
376 log(level, tp.getMessage(), tp.getThrowable());
377 }
378
379
380
381
382
383
384
385
386 private void formatAndLog(int level, String format, Object[] argArray) {
387 if (! isLevelEnabled(level)) {
388 return;
389 }
390 FormattingTuple tp = MessageFormatter.arrayFormat(format, argArray);
391 log(level, tp.getMessage(), tp.getThrowable());
392 }
393
394
395
396
397
398
399 protected boolean isLevelEnabled(int logLevel) {
400
401
402 return (logLevel >= currentLogLevel);
403 }
404
405
406
407
408
409 public boolean isTraceEnabled() {
410 return isLevelEnabled(LOG_LEVEL_TRACE);
411 }
412
413
414
415
416
417 public void trace(String msg) {
418 log(LOG_LEVEL_TRACE, msg, null);
419 }
420
421
422
423
424
425 public void trace(String format, Object param1) {
426 formatAndLog(LOG_LEVEL_TRACE, format, param1, null);
427 }
428
429
430
431
432
433 public void trace(String format, Object param1, Object param2) {
434 formatAndLog(LOG_LEVEL_TRACE, format, param1, param2);
435 }
436
437
438
439
440
441 public void trace(String format, Object[] argArray) {
442 formatAndLog(LOG_LEVEL_TRACE, format, argArray);
443 }
444
445
446
447
448 public void trace(String msg, Throwable t) {
449 log(LOG_LEVEL_TRACE, msg, t);
450 }
451
452
453
454
455 public boolean isDebugEnabled() {
456 return isLevelEnabled(LOG_LEVEL_DEBUG);
457 }
458
459
460
461
462
463 public void debug(String msg) {
464 log(LOG_LEVEL_DEBUG, msg, null);
465 }
466
467
468
469
470
471 public void debug(String format, Object param1) {
472 formatAndLog(LOG_LEVEL_DEBUG, format, param1, null);
473 }
474
475
476
477
478
479 public void debug(String format, Object param1, Object param2) {
480 formatAndLog(LOG_LEVEL_DEBUG, format, param1, param2);
481 }
482
483
484
485
486
487 public void debug(String format, Object[] argArray) {
488 formatAndLog(LOG_LEVEL_DEBUG, format, argArray);
489 }
490
491
492
493
494 public void debug(String msg, Throwable t) {
495 log(LOG_LEVEL_DEBUG, msg, t);
496 }
497
498
499
500
501 public boolean isInfoEnabled() {
502 return isLevelEnabled(LOG_LEVEL_INFO);
503 }
504
505
506
507
508
509 public void info(String msg) {
510 log(LOG_LEVEL_INFO, msg, null);
511 }
512
513
514
515
516
517 public void info(String format, Object arg) {
518 formatAndLog(LOG_LEVEL_INFO, format, arg, null);
519 }
520
521
522
523
524
525 public void info(String format, Object arg1, Object arg2) {
526 formatAndLog(LOG_LEVEL_INFO, format, arg1, arg2);
527 }
528
529
530
531
532
533 public void info(String format, Object[] argArray) {
534 formatAndLog(LOG_LEVEL_INFO, format, argArray);
535 }
536
537
538
539
540 public void info(String msg, Throwable t) {
541 log(LOG_LEVEL_INFO, msg, t);
542 }
543
544
545
546
547 public boolean isWarnEnabled() {
548 return isLevelEnabled(LOG_LEVEL_WARN);
549 }
550
551
552
553
554
555 public void warn(String msg) {
556 log(LOG_LEVEL_WARN, msg, null);
557 }
558
559
560
561
562
563 public void warn(String format, Object arg) {
564 formatAndLog(LOG_LEVEL_WARN, format, arg, null);
565 }
566
567
568
569
570
571 public void warn(String format, Object arg1, Object arg2) {
572 formatAndLog(LOG_LEVEL_WARN, format, arg1, arg2);
573 }
574
575
576
577
578
579 public void warn(String format, Object[] argArray) {
580 formatAndLog(LOG_LEVEL_WARN, format, argArray);
581 }
582
583
584
585
586 public void warn(String msg, Throwable t) {
587 log(LOG_LEVEL_WARN, msg, t);
588 }
589
590
591
592
593 public boolean isErrorEnabled() {
594 return isLevelEnabled(LOG_LEVEL_ERROR);
595 }
596
597
598
599
600
601 public void error(String msg) {
602 log(LOG_LEVEL_ERROR, msg, null);
603 }
604
605
606
607
608
609 public void error(String format, Object arg) {
610 formatAndLog(LOG_LEVEL_ERROR, format, arg, null);
611 }
612
613
614
615
616
617 public void error(String format, Object arg1, Object arg2) {
618 formatAndLog(LOG_LEVEL_ERROR, format, arg1, arg2);
619 }
620
621
622
623
624
625 public void error(String format, Object[] argArray) {
626 formatAndLog(LOG_LEVEL_ERROR, format, argArray);
627 }
628
629
630
631
632 public void error(String msg, Throwable t) {
633 log(LOG_LEVEL_ERROR, msg, t);
634 }
635 }