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.impl;
26
27 import java.util.logging.Level;
28 import java.util.logging.LogRecord;
29
30 import org.slf4j.Logger;
31 import org.slf4j.Marker;
32 import org.slf4j.event.EventConstants;
33 import org.slf4j.event.LoggingEvent;
34 import org.slf4j.helpers.FormattingTuple;
35 import org.slf4j.helpers.MarkerIgnoringBase;
36 import org.slf4j.helpers.MessageFormatter;
37 import org.slf4j.spi.LocationAwareLogger;
38
39
40
41
42
43
44
45
46
47
48 public final class JDK14LoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger {
49
50 private static final long serialVersionUID = -8053026990503422791L;
51
52 transient final java.util.logging.Logger logger;
53
54
55
56 JDK14LoggerAdapter(java.util.logging.Logger logger) {
57 this.logger = logger;
58 this.name = logger.getName();
59 }
60
61
62
63
64
65
66 public boolean isTraceEnabled() {
67 return logger.isLoggable(Level.FINEST);
68 }
69
70
71
72
73
74
75
76 public void trace(String msg) {
77 if (logger.isLoggable(Level.FINEST)) {
78 log(SELF, Level.FINEST, msg, null);
79 }
80 }
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 public void trace(String format, Object arg) {
97 if (logger.isLoggable(Level.FINEST)) {
98 FormattingTuple ft = MessageFormatter.format(format, arg);
99 log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
100 }
101 }
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119 public void trace(String format, Object arg1, Object arg2) {
120 if (logger.isLoggable(Level.FINEST)) {
121 FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
122 log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
123 }
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 public void trace(String format, Object... argArray) {
141 if (logger.isLoggable(Level.FINEST)) {
142 FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
143 log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
144 }
145 }
146
147
148
149
150
151
152
153
154
155 public void trace(String msg, Throwable t) {
156 if (logger.isLoggable(Level.FINEST)) {
157 log(SELF, Level.FINEST, msg, t);
158 }
159 }
160
161
162
163
164
165
166 public boolean isDebugEnabled() {
167 return logger.isLoggable(Level.FINE);
168 }
169
170
171
172
173
174
175
176 public void debug(String msg) {
177 if (logger.isLoggable(Level.FINE)) {
178 log(SELF, Level.FINE, msg, null);
179 }
180 }
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195 public void debug(String format, Object arg) {
196 if (logger.isLoggable(Level.FINE)) {
197 FormattingTuple ft = MessageFormatter.format(format, arg);
198 log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
199 }
200 }
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218 public void debug(String format, Object arg1, Object arg2) {
219 if (logger.isLoggable(Level.FINE)) {
220 FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
221 log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
222 }
223 }
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239 public void debug(String format, Object... argArray) {
240 if (logger.isLoggable(Level.FINE)) {
241 FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
242 log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
243 }
244 }
245
246
247
248
249
250
251
252
253
254 public void debug(String msg, Throwable t) {
255 if (logger.isLoggable(Level.FINE)) {
256 log(SELF, Level.FINE, msg, t);
257 }
258 }
259
260
261
262
263
264
265 public boolean isInfoEnabled() {
266 return logger.isLoggable(Level.INFO);
267 }
268
269
270
271
272
273
274
275 public void info(String msg) {
276 if (logger.isLoggable(Level.INFO)) {
277 log(SELF, Level.INFO, msg, null);
278 }
279 }
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294 public void info(String format, Object arg) {
295 if (logger.isLoggable(Level.INFO)) {
296 FormattingTuple ft = MessageFormatter.format(format, arg);
297 log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
298 }
299 }
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317 public void info(String format, Object arg1, Object arg2) {
318 if (logger.isLoggable(Level.INFO)) {
319 FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
320 log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
321 }
322 }
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338 public void info(String format, Object... argArray) {
339 if (logger.isLoggable(Level.INFO)) {
340 FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
341 log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
342 }
343 }
344
345
346
347
348
349
350
351
352
353
354 public void info(String msg, Throwable t) {
355 if (logger.isLoggable(Level.INFO)) {
356 log(SELF, Level.INFO, msg, t);
357 }
358 }
359
360
361
362
363
364
365
366 public boolean isWarnEnabled() {
367 return logger.isLoggable(Level.WARNING);
368 }
369
370
371
372
373
374
375
376 public void warn(String msg) {
377 if (logger.isLoggable(Level.WARNING)) {
378 log(SELF, Level.WARNING, msg, null);
379 }
380 }
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396 public void warn(String format, Object arg) {
397 if (logger.isLoggable(Level.WARNING)) {
398 FormattingTuple ft = MessageFormatter.format(format, arg);
399 log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
400 }
401 }
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419 public void warn(String format, Object arg1, Object arg2) {
420 if (logger.isLoggable(Level.WARNING)) {
421 FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
422 log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
423 }
424 }
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440 public void warn(String format, Object... argArray) {
441 if (logger.isLoggable(Level.WARNING)) {
442 FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
443 log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
444 }
445 }
446
447
448
449
450
451
452
453
454
455
456 public void warn(String msg, Throwable t) {
457 if (logger.isLoggable(Level.WARNING)) {
458 log(SELF, Level.WARNING, msg, t);
459 }
460 }
461
462
463
464
465
466
467 public boolean isErrorEnabled() {
468 return logger.isLoggable(Level.SEVERE);
469 }
470
471
472
473
474
475
476
477 public void error(String msg) {
478 if (logger.isLoggable(Level.SEVERE)) {
479 log(SELF, Level.SEVERE, msg, null);
480 }
481 }
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497 public void error(String format, Object arg) {
498 if (logger.isLoggable(Level.SEVERE)) {
499 FormattingTuple ft = MessageFormatter.format(format, arg);
500 log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
501 }
502 }
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520 public void error(String format, Object arg1, Object arg2) {
521 if (logger.isLoggable(Level.SEVERE)) {
522 FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
523 log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
524 }
525 }
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541 public void error(String format, Object... arguments) {
542 if (logger.isLoggable(Level.SEVERE)) {
543 FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
544 log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
545 }
546 }
547
548
549
550
551
552
553
554
555
556
557 public void error(String msg, Throwable t) {
558 if (logger.isLoggable(Level.SEVERE)) {
559 log(SELF, Level.SEVERE, msg, t);
560 }
561 }
562
563
564
565
566
567
568
569
570
571
572
573
574 private void log(String callerFQCN, Level level, String msg, Throwable t) {
575
576 LogRecord record = new LogRecord(level, msg);
577 record.setLoggerName(getName());
578 record.setThrown(t);
579
580
581 fillCallerData(callerFQCN, record);
582 logger.log(record);
583 }
584
585 static String SELF = JDK14LoggerAdapter.class.getName();
586 static String SUPER = MarkerIgnoringBase.class.getName();
587
588
589
590
591
592
593
594 final private void fillCallerData(String callerFQCN, LogRecord record) {
595 StackTraceElement[] steArray = new Throwable().getStackTrace();
596
597 int selfIndex = -1;
598 for (int i = 0; i < steArray.length; i++) {
599 final String className = steArray[i].getClassName();
600 if (className.equals(callerFQCN) || className.equals(SUPER)) {
601 selfIndex = i;
602 break;
603 }
604 }
605
606 int found = -1;
607 for (int i = selfIndex + 1; i < steArray.length; i++) {
608 final String className = steArray[i].getClassName();
609 if (!(className.equals(callerFQCN) || className.equals(SUPER))) {
610 found = i;
611 break;
612 }
613 }
614
615 if (found != -1) {
616 StackTraceElement ste = steArray[found];
617
618
619 record.setSourceClassName(ste.getClassName());
620 record.setSourceMethodName(ste.getMethodName());
621 }
622 }
623
624 public void log(Marker marker, String callerFQCN, int level, String message, Object[] argArray, Throwable t) {
625 Level julLevel = slf4jLevelIntToJULLevel(level);
626
627
628
629
630
631 if (logger.isLoggable(julLevel)) {
632 log(callerFQCN, julLevel, message, t);
633 }
634 }
635
636 private Level slf4jLevelIntToJULLevel(int slf4jLevelInt) {
637 Level julLevel;
638 switch (slf4jLevelInt) {
639 case LocationAwareLogger.TRACE_INT:
640 julLevel = Level.FINEST;
641 break;
642 case LocationAwareLogger.DEBUG_INT:
643 julLevel = Level.FINE;
644 break;
645 case LocationAwareLogger.INFO_INT:
646 julLevel = Level.INFO;
647 break;
648 case LocationAwareLogger.WARN_INT:
649 julLevel = Level.WARNING;
650 break;
651 case LocationAwareLogger.ERROR_INT:
652 julLevel = Level.SEVERE;
653 break;
654 default:
655 throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
656 }
657 return julLevel;
658 }
659
660
661
662
663 public void log(LoggingEvent event) {
664 Level julLevel = slf4jLevelIntToJULLevel(event.getLevel().toInt());
665 if (logger.isLoggable(julLevel)) {
666 LogRecord record = eventToRecord(event, julLevel);
667 logger.log(record);
668 }
669 }
670
671 private LogRecord eventToRecord(LoggingEvent event, Level julLevel) {
672 String format = event.getMessage();
673 Object[] arguments = event.getArgumentArray();
674 FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
675 if (ft.getThrowable() != null && event.getThrowable() != null) {
676 throw new IllegalArgumentException("both last element in argument array and last argument are of type Throwable");
677 }
678
679 Throwable t = event.getThrowable();
680 if (ft.getThrowable() != null) {
681 t = ft.getThrowable();
682 throw new IllegalStateException("fix above code");
683 }
684
685 LogRecord record = new LogRecord(julLevel, ft.getMessage());
686 record.setLoggerName(event.getLoggerName());
687 record.setMillis(event.getTimeStamp());
688 record.setSourceClassName(EventConstants.NA_SUBST);
689 record.setSourceMethodName(EventConstants.NA_SUBST);
690
691 record.setThrown(t);
692 return record;
693 }
694 }