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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 package org.slf4j.impl;
46
47 import info.ronjenkins.slf4bukkit.BukkitColorMapper;
48 import info.ronjenkins.slf4bukkit.BukkitColorMarker;
49
50 import java.io.IOException;
51 import java.io.InputStream;
52 import java.util.ArrayList;
53 import java.util.Arrays;
54 import java.util.List;
55 import java.util.Map;
56
57 import org.apache.commons.lang.exception.ExceptionUtils;
58 import org.bukkit.Bukkit;
59 import org.bukkit.ChatColor;
60 import org.bukkit.plugin.Plugin;
61 import org.slf4j.Logger;
62 import org.slf4j.Marker;
63 import org.slf4j.event.Level;
64 import org.slf4j.helpers.FormattingTuple;
65 import org.slf4j.helpers.MessageFormatter;
66 import org.yaml.snakeyaml.Yaml;
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179 public final class BukkitPluginLoggerAdapter implements Logger {
180
181
182 private static transient Plugin BUKKIT_PLUGIN;
183 private static transient String BUKKIT_PLUGIN_NAME;
184
185 private static final String CONFIG_FALLBACK_DEFAULT_LOG_LEVEL = "info";
186 private static final boolean CONFIG_FALLBACK_SHOW_HEADER = false;
187 private static final boolean CONFIG_FALLBACK_SHOW_LOG_NAME = false;
188 private static final boolean CONFIG_FALLBACK_SHOW_SHORT_LOG_NAME = true;
189 private static final boolean CONFIG_FALLBACK_SHOW_THREAD_NAME = false;
190 private static final String CONFIG_KEY_DEFAULT_LOG_LEVEL = "slf4j.defaultLogLevel";
191 private static final String CONFIG_KEY_PREFIX_LOG = "slf4j.log.";
192 private static final String CONFIG_KEY_SHOW_HEADER = "slf4j.showHeader";
193 private static final String CONFIG_KEY_SHOW_LOG_NAME = "slf4j.showLogName";
194 private static final String CONFIG_KEY_SHOW_SHORT_LOG_NAME = "slf4j.showShortLogName";
195 private static final String CONFIG_KEY_SHOW_THREAD_NAME = "slf4j.showThreadName";
196 private static Level CONFIG_VALUE_DEFAULT_LOG_LEVEL;
197 private static boolean CONFIG_VALUE_SHOW_HEADER;
198 private static boolean CONFIG_VALUE_SHOW_LOG_NAME;
199 private static boolean CONFIG_VALUE_SHOW_SHORT_LOG_NAME;
200 private static boolean CONFIG_VALUE_SHOW_THREAD_NAME;
201
202 private static final Object INITIALIZATION_LOCK = new Object();
203
204 private final String name;
205
206 private transient String shortLogName = null;
207
208
209
210 BukkitPluginLoggerAdapter(final String name) {
211 this.name = name;
212 }
213
214
215
216
217
218
219
220
221
222 public static void init(final boolean reinitialize) {
223 synchronized (BukkitPluginLoggerAdapter.INITIALIZATION_LOCK) {
224
225 if (reinitialize) {
226 BukkitPluginLoggerAdapter.BUKKIT_PLUGIN = null;
227 BukkitPluginLoggerAdapter.BUKKIT_PLUGIN_NAME = null;
228 } else if (BukkitPluginLoggerAdapter.BUKKIT_PLUGIN != null) { return; }
229
230 if (BukkitPluginLoggerAdapter.BUKKIT_PLUGIN_NAME == null) {
231 InputStream pluginYmlFile = null;
232 try {
233 pluginYmlFile = BukkitPluginLoggerAdapter.class.getClassLoader()
234 .getResource("plugin.yml")
235 .openStream();
236 final Yaml yaml = new Yaml();
237 @SuppressWarnings("rawtypes")
238 final Map pluginYml = (Map) yaml.load(pluginYmlFile);
239 BukkitPluginLoggerAdapter.BUKKIT_PLUGIN_NAME = (String) pluginYml.get("name");
240 } catch (final IOException e) {
241 throw new IllegalStateException(e);
242 } finally {
243 if (pluginYmlFile != null) {
244 try {
245 pluginYmlFile.close();
246 } catch (final IOException e) {
247 e.printStackTrace();
248 }
249 }
250 }
251 }
252
253
254
255
256 BukkitPluginLoggerAdapter.BUKKIT_PLUGIN = Bukkit.getPluginManager()
257 .getPlugin(BukkitPluginLoggerAdapter.BUKKIT_PLUGIN_NAME);
258
259
260
261
262
263 BukkitPluginLoggerAdapter.CONFIG_VALUE_DEFAULT_LOG_LEVEL = BukkitPluginLoggerAdapter.stringToLevel(BukkitPluginLoggerAdapter.getStringProperty(BukkitPluginLoggerAdapter.CONFIG_KEY_DEFAULT_LOG_LEVEL,
264 BukkitPluginLoggerAdapter.CONFIG_FALLBACK_DEFAULT_LOG_LEVEL));
265 if (BukkitPluginLoggerAdapter.CONFIG_VALUE_DEFAULT_LOG_LEVEL == null) {
266 BukkitPluginLoggerAdapter.CONFIG_VALUE_DEFAULT_LOG_LEVEL = BukkitPluginLoggerAdapter.stringToLevel(BukkitPluginLoggerAdapter.CONFIG_FALLBACK_DEFAULT_LOG_LEVEL);
267 }
268 BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_HEADER = BukkitPluginLoggerAdapter.getBooleanProperty(BukkitPluginLoggerAdapter.CONFIG_KEY_SHOW_HEADER,
269 BukkitPluginLoggerAdapter.CONFIG_FALLBACK_SHOW_HEADER);
270 BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_LOG_NAME = BukkitPluginLoggerAdapter.getBooleanProperty(BukkitPluginLoggerAdapter.CONFIG_KEY_SHOW_LOG_NAME,
271 BukkitPluginLoggerAdapter.CONFIG_FALLBACK_SHOW_LOG_NAME);
272 BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_SHORT_LOG_NAME = BukkitPluginLoggerAdapter.getBooleanProperty(BukkitPluginLoggerAdapter.CONFIG_KEY_SHOW_SHORT_LOG_NAME,
273 BukkitPluginLoggerAdapter.CONFIG_FALLBACK_SHOW_SHORT_LOG_NAME);
274 BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_THREAD_NAME = BukkitPluginLoggerAdapter.getBooleanProperty(BukkitPluginLoggerAdapter.CONFIG_KEY_SHOW_THREAD_NAME,
275 BukkitPluginLoggerAdapter.CONFIG_FALLBACK_SHOW_THREAD_NAME);
276 }
277 }
278
279
280
281
282
283
284
285
286
287
288
289
290
291 private static boolean getBooleanProperty(final String name,
292 final boolean defaultValue) {
293 synchronized (BukkitPluginLoggerAdapter.INITIALIZATION_LOCK) {
294 if (BukkitPluginLoggerAdapter.BUKKIT_PLUGIN == null) { return defaultValue; }
295 final String prop = BukkitPluginLoggerAdapter.BUKKIT_PLUGIN.getConfig()
296 .getString(name);
297 if ("true".equalsIgnoreCase(prop)) { return true; }
298 if ("false".equalsIgnoreCase(prop)) { return false; }
299 return defaultValue;
300 }
301 }
302
303
304
305
306
307
308
309 private static java.util.logging.Logger getBukkitLogger() {
310 synchronized (BukkitPluginLoggerAdapter.INITIALIZATION_LOCK) {
311 return BukkitPluginLoggerAdapter.BUKKIT_PLUGIN == null ? Bukkit.getLogger()
312 : BukkitPluginLoggerAdapter.BUKKIT_PLUGIN.getLogger();
313 }
314 }
315
316
317
318
319
320
321
322
323
324
325
326 private static String getStringProperty(final String name,
327 final String defaultValue) {
328 synchronized (BukkitPluginLoggerAdapter.INITIALIZATION_LOCK) {
329 if (BukkitPluginLoggerAdapter.BUKKIT_PLUGIN == null) { return defaultValue; }
330 final String prop = BukkitPluginLoggerAdapter.BUKKIT_PLUGIN.getConfig()
331 .getString(name);
332 return (prop == null) ? defaultValue : prop;
333 }
334 }
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350 private static java.util.logging.Level
351 slf4jLevelIntToBukkitJULLevel(final Level slf4jLevel) {
352 java.util.logging.Level julLevel;
353 switch (slf4jLevel) {
354 case ERROR:
355 julLevel = java.util.logging.Level.SEVERE;
356 break;
357 case WARN:
358 julLevel = java.util.logging.Level.WARNING;
359 break;
360 default:
361
362
363
364 julLevel = java.util.logging.Level.INFO;
365 break;
366 }
367 return julLevel;
368 }
369
370
371
372
373
374
375
376
377
378 private static Level stringToLevel(final String levelStr) {
379 if ("trace".equalsIgnoreCase(levelStr)) {
380 return Level.TRACE;
381 } else if ("debug".equalsIgnoreCase(levelStr)) {
382 return Level.DEBUG;
383 } else if ("info".equalsIgnoreCase(levelStr)) {
384 return Level.INFO;
385 } else if ("warn".equalsIgnoreCase(levelStr)) {
386 return Level.WARN;
387 } else if ("error".equalsIgnoreCase(levelStr)) {
388 return Level.ERROR;
389 } else {
390 return null;
391 }
392 }
393
394 @Override
395 public void debug(final Marker marker, final String msg) {
396 if (!this.isDebugEnabled()) { return; }
397 this.log(Level.DEBUG, marker, msg, null);
398 }
399
400 @Override
401 public void debug(final Marker marker, final String format, final Object arg) {
402 if (!this.isDebugEnabled()) { return; }
403 this.formatAndLog(Level.DEBUG, marker, format, arg, null);
404 }
405
406 @Override
407 public void debug(final Marker marker, final String format,
408 final Object... arguments) {
409 if (!this.isDebugEnabled()) { return; }
410 this.formatAndLog(Level.DEBUG, marker, format, arguments);
411 }
412
413 @Override
414 public void debug(final Marker marker, final String format,
415 final Object arg1, final Object arg2) {
416 if (!this.isDebugEnabled()) { return; }
417 this.formatAndLog(Level.DEBUG, marker, format, arg1, arg2);
418 }
419
420 @Override
421 public void debug(final Marker marker, final String msg, final Throwable t) {
422 if (!this.isDebugEnabled()) { return; }
423 this.log(Level.DEBUG, marker, msg, t);
424 }
425
426 @Override
427 public void debug(final String msg) {
428 if (!this.isDebugEnabled()) { return; }
429 this.log(Level.DEBUG, null, msg, null);
430 }
431
432 @Override
433 public void debug(final String format, final Object arg) {
434 if (!this.isDebugEnabled()) { return; }
435 this.formatAndLog(Level.DEBUG, null, format, arg, null);
436 }
437
438 @Override
439 public void debug(final String format, final Object... arguments) {
440 if (!this.isDebugEnabled()) { return; }
441 this.formatAndLog(Level.DEBUG, null, format, arguments);
442 }
443
444 @Override
445 public void debug(final String format, final Object arg1, final Object arg2) {
446 if (!this.isDebugEnabled()) { return; }
447 this.formatAndLog(Level.DEBUG, null, format, arg1, arg2);
448 }
449
450 @Override
451 public void debug(final String msg, final Throwable t) {
452 if (!this.isDebugEnabled()) { return; }
453 this.log(Level.DEBUG, null, msg, t);
454 }
455
456 @Override
457 public void error(final Marker marker, final String msg) {
458 if (!this.isErrorEnabled()) { return; }
459 this.log(Level.ERROR, marker, msg, null);
460 }
461
462 @Override
463 public void error(final Marker marker, final String format, final Object arg) {
464 if (!this.isErrorEnabled()) { return; }
465 this.formatAndLog(Level.ERROR, marker, format, arg, null);
466 }
467
468 @Override
469 public void error(final Marker marker, final String format,
470 final Object... arguments) {
471 if (!this.isErrorEnabled()) { return; }
472 this.formatAndLog(Level.ERROR, marker, format, arguments);
473 }
474
475 @Override
476 public void error(final Marker marker, final String format,
477 final Object arg1, final Object arg2) {
478 if (!this.isErrorEnabled()) { return; }
479 this.formatAndLog(Level.ERROR, marker, format, arg1, arg2);
480 }
481
482 @Override
483 public void error(final Marker marker, final String msg, final Throwable t) {
484 if (!this.isErrorEnabled()) { return; }
485 this.log(Level.ERROR, marker, msg, t);
486 }
487
488 @Override
489 public void error(final String msg) {
490 if (!this.isErrorEnabled()) { return; }
491 this.log(Level.ERROR, null, msg, null);
492 }
493
494 @Override
495 public void error(final String format, final Object arg) {
496 if (!this.isErrorEnabled()) { return; }
497 this.formatAndLog(Level.ERROR, null, format, arg, null);
498 }
499
500 @Override
501 public void error(final String format, final Object... arguments) {
502 if (!this.isErrorEnabled()) { return; }
503 this.formatAndLog(Level.ERROR, null, format, arguments);
504 }
505
506 @Override
507 public void error(final String format, final Object arg1, final Object arg2) {
508 if (!this.isErrorEnabled()) { return; }
509 this.formatAndLog(Level.ERROR, null, format, arg1, arg2);
510 }
511
512 @Override
513 public void error(final String msg, final Throwable t) {
514 if (!this.isErrorEnabled()) { return; }
515 this.log(Level.ERROR, null, msg, t);
516 }
517
518 @Override
519 public String getName() {
520 return this.name;
521 }
522
523 @Override
524 public void info(final Marker marker, final String msg) {
525 if (!this.isInfoEnabled()) { return; }
526 this.log(Level.INFO, marker, msg, null);
527 }
528
529 @Override
530 public void info(final Marker marker, final String format, final Object arg) {
531 if (!this.isInfoEnabled()) { return; }
532 this.formatAndLog(Level.INFO, marker, format, arg, null);
533 }
534
535 @Override
536 public void info(final Marker marker, final String format,
537 final Object... arguments) {
538 if (!this.isInfoEnabled()) { return; }
539 this.formatAndLog(Level.INFO, marker, format, arguments);
540 }
541
542 @Override
543 public void info(final Marker marker, final String format, final Object arg1,
544 final Object arg2) {
545 if (!this.isInfoEnabled()) { return; }
546 this.formatAndLog(Level.INFO, marker, format, arg1, arg2);
547 }
548
549 @Override
550 public void info(final Marker marker, final String msg, final Throwable t) {
551 if (!this.isInfoEnabled()) { return; }
552 this.log(Level.INFO, marker, msg, t);
553 }
554
555 @Override
556 public void info(final String msg) {
557 if (!this.isInfoEnabled()) { return; }
558 this.log(Level.INFO, null, msg, null);
559 }
560
561 @Override
562 public void info(final String format, final Object arg) {
563 if (!this.isInfoEnabled()) { return; }
564 this.formatAndLog(Level.INFO, null, format, arg, null);
565 }
566
567 @Override
568 public void info(final String format, final Object... arguments) {
569 if (!this.isInfoEnabled()) { return; }
570 this.formatAndLog(Level.INFO, null, format, arguments);
571 }
572
573 @Override
574 public void info(final String format, final Object arg1, final Object arg2) {
575 if (!this.isInfoEnabled()) { return; }
576 this.formatAndLog(Level.INFO, null, format, arg1, arg2);
577 }
578
579 @Override
580 public void info(final String msg, final Throwable t) {
581 if (!this.isInfoEnabled()) { return; }
582 this.log(Level.INFO, null, msg, t);
583 }
584
585 @Override
586 public boolean isDebugEnabled() {
587 return this.isLevelEnabled(Level.DEBUG);
588 }
589
590 @Override
591 public boolean isDebugEnabled(final Marker marker) {
592 return this.isLevelEnabled(Level.DEBUG);
593 }
594
595 @Override
596 public boolean isErrorEnabled() {
597 return this.isLevelEnabled(Level.ERROR);
598 }
599
600 @Override
601 public boolean isErrorEnabled(final Marker marker) {
602 return this.isLevelEnabled(Level.ERROR);
603 }
604
605 @Override
606 public boolean isInfoEnabled() {
607 return this.isLevelEnabled(Level.INFO);
608 }
609
610 @Override
611 public boolean isInfoEnabled(final Marker marker) {
612 return this.isLevelEnabled(Level.INFO);
613 }
614
615 @Override
616 public boolean isTraceEnabled() {
617 return this.isLevelEnabled(Level.TRACE);
618 }
619
620 @Override
621 public boolean isTraceEnabled(final Marker marker) {
622 return this.isLevelEnabled(Level.TRACE);
623 }
624
625 @Override
626 public boolean isWarnEnabled() {
627 return this.isLevelEnabled(Level.WARN);
628 }
629
630 @Override
631 public boolean isWarnEnabled(final Marker marker) {
632 return this.isLevelEnabled(Level.WARN);
633 }
634
635 @Override
636 public void trace(final Marker marker, final String msg) {
637 if (!this.isTraceEnabled()) { return; }
638 this.log(Level.TRACE, marker, msg, null);
639 }
640
641 @Override
642 public void trace(final Marker marker, final String format, final Object arg) {
643 if (!this.isTraceEnabled()) { return; }
644 this.formatAndLog(Level.TRACE, marker, format, arg, null);
645 }
646
647 @Override
648 public void trace(final Marker marker, final String format,
649 final Object... arguments) {
650 if (!this.isTraceEnabled()) { return; }
651 this.formatAndLog(Level.TRACE, marker, format, arguments);
652 }
653
654 @Override
655 public void trace(final Marker marker, final String format,
656 final Object arg1, final Object arg2) {
657 if (!this.isTraceEnabled()) { return; }
658 this.formatAndLog(Level.TRACE, marker, format, arg1, arg2);
659 }
660
661 @Override
662 public void trace(final Marker marker, final String msg, final Throwable t) {
663 if (!this.isTraceEnabled()) { return; }
664 this.log(Level.TRACE, marker, msg, t);
665 }
666
667 @Override
668 public void trace(final String msg) {
669 if (!this.isTraceEnabled()) { return; }
670 this.log(Level.TRACE, null, msg, null);
671 }
672
673 @Override
674 public void trace(final String format, final Object arg) {
675 if (!this.isTraceEnabled()) { return; }
676 this.formatAndLog(Level.TRACE, null, format, arg, null);
677 }
678
679 @Override
680 public void trace(final String format, final Object... arguments) {
681 if (!this.isTraceEnabled()) { return; }
682 this.formatAndLog(Level.TRACE, null, format, arguments);
683 }
684
685 @Override
686 public void trace(final String format, final Object arg1, final Object arg2) {
687 if (!this.isTraceEnabled()) { return; }
688 this.formatAndLog(Level.TRACE, null, format, arg1, arg2);
689 }
690
691 @Override
692 public void trace(final String msg, final Throwable t) {
693 if (!this.isTraceEnabled()) { return; }
694 this.log(Level.TRACE, null, msg, t);
695 }
696
697 @Override
698 public void warn(final Marker marker, final String msg) {
699 if (!this.isWarnEnabled()) { return; }
700 this.log(Level.WARN, marker, msg, null);
701 }
702
703 @Override
704 public void warn(final Marker marker, final String format, final Object arg) {
705 if (!this.isWarnEnabled()) { return; }
706 this.formatAndLog(Level.WARN, marker, format, arg, null);
707 }
708
709 @Override
710 public void warn(final Marker marker, final String format,
711 final Object... arguments) {
712 if (!this.isWarnEnabled()) { return; }
713 this.formatAndLog(Level.WARN, marker, format, arguments);
714 }
715
716 @Override
717 public void warn(final Marker marker, final String format, final Object arg1,
718 final Object arg2) {
719 if (!this.isWarnEnabled()) { return; }
720 this.formatAndLog(Level.WARN, marker, format, arg1, arg2);
721 }
722
723 @Override
724 public void warn(final Marker marker, final String msg, final Throwable t) {
725 if (!this.isWarnEnabled()) { return; }
726 this.log(Level.WARN, marker, msg, t);
727 }
728
729 @Override
730 public void warn(final String msg) {
731 if (!this.isWarnEnabled()) { return; }
732 this.log(Level.WARN, null, msg, null);
733 }
734
735 @Override
736 public void warn(final String format, final Object arg) {
737 if (!this.isWarnEnabled()) { return; }
738 this.formatAndLog(Level.WARN, null, format, arg, null);
739 }
740
741 @Override
742 public void warn(final String format, final Object... arguments) {
743 if (!this.isWarnEnabled()) { return; }
744 this.formatAndLog(Level.WARN, null, format, arguments);
745 }
746
747 @Override
748 public void warn(final String format, final Object arg1, final Object arg2) {
749 if (!this.isWarnEnabled()) { return; }
750 this.formatAndLog(Level.WARN, null, format, arg1, arg2);
751 }
752
753 @Override
754 public void warn(final String msg, final Throwable t) {
755 if (!this.isWarnEnabled()) { return; }
756 this.log(Level.WARN, null, msg, t);
757 }
758
759
760
761
762
763
764
765
766 private String computeShortName() {
767 final List<String> splitName = new ArrayList<String>();
768 splitName.addAll(Arrays.asList(this.name.split("\\.")));
769 final int shortNameLength = ((splitName.size() - 1) * 2)
770 + splitName.get(splitName.size() - 1).length();
771 final String finalName = splitName.remove(splitName.size() - 1);
772 final StringBuffer shortName = new StringBuffer(shortNameLength);
773 for (final String part : splitName) {
774 shortName.append(part.charAt(0)).append('.');
775 }
776 shortName.append(finalName);
777 return shortName.toString();
778 }
779
780
781
782
783
784
785
786
787 private Level determineCurrentLevel() {
788
789 String tempName = this.name;
790 Level level = null;
791 int indexOfLastDot = tempName.length();
792 while ((level == null) && (indexOfLastDot > -1)) {
793 tempName = tempName.substring(0, indexOfLastDot);
794 level = BukkitPluginLoggerAdapter.stringToLevel(BukkitPluginLoggerAdapter.getStringProperty(BukkitPluginLoggerAdapter.CONFIG_KEY_PREFIX_LOG
795 + tempName,
796 null));
797 indexOfLastDot = String.valueOf(tempName).lastIndexOf(".");
798 }
799
800 return (level == null) ? BukkitPluginLoggerAdapter.CONFIG_VALUE_DEFAULT_LOG_LEVEL
801 : level;
802 }
803
804
805
806
807
808
809
810
811
812
813
814
815
816 private void formatAndLog(final Level level, final Marker marker,
817 final String format, final Object... arguments) {
818 if (!this.isLevelEnabled(level)) { return; }
819 final FormattingTuple tp = MessageFormatter.arrayFormat(format, arguments);
820 this.log(level, marker, tp.getMessage(), tp.getThrowable());
821 }
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837 private void formatAndLog(final Level level, final Marker marker,
838 final String format, final Object arg1,
839 final Object arg2) {
840 if (!this.isLevelEnabled(level)) { return; }
841 final FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
842 this.log(level, marker, tp.getMessage(), tp.getThrowable());
843 }
844
845
846
847
848
849
850
851
852 private boolean isLevelEnabled(final Level logLevel) {
853
854
855
856 BukkitPluginLoggerAdapter.init(false);
857
858
859
860
861
862
863 final Level currentLogLevel = this.determineCurrentLevel();
864 return (logLevel.toInt() >= currentLogLevel.toInt())
865 && (BukkitPluginLoggerAdapter.getBukkitLogger().isLoggable(BukkitPluginLoggerAdapter.slf4jLevelIntToBukkitJULLevel(logLevel)));
866 }
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881 private void log(final Level level, final Marker marker,
882 final String message, final Throwable throwable) {
883 final java.util.logging.Logger logger;
884 synchronized (BukkitPluginLoggerAdapter.INITIALIZATION_LOCK) {
885
886 if (!this.isLevelEnabled(level)) { return; }
887
888 logger = BukkitPluginLoggerAdapter.getBukkitLogger();
889 }
890
891
892 final StringBuilder buf = new StringBuilder(32);
893 boolean hasHeader = false;
894
895
896 if (marker instanceof BukkitColorMarker) {
897 buf.append(((BukkitColorMarker) marker).getValue());
898 }
899
900
901 if (BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_HEADER) {
902 hasHeader = true;
903 buf.append("[SLF4J]");
904 }
905
906
907
908 switch (level) {
909 case TRACE:
910 hasHeader = true;
911 buf.append("[TRACE]");
912 break;
913 case DEBUG:
914 hasHeader = true;
915 buf.append("[DEBUG]");
916 break;
917 default:
918 break;
919 }
920
921
922 if (BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_THREAD_NAME) {
923 hasHeader = true;
924 buf.append('[');
925 buf.append(Thread.currentThread().getName());
926 buf.append("]");
927 }
928
929
930 if (hasHeader) {
931 buf.append(' ');
932 }
933
934
935 if (BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_LOG_NAME) {
936 buf.append('{').append(this.name).append("} ");
937 } else if (BukkitPluginLoggerAdapter.CONFIG_VALUE_SHOW_SHORT_LOG_NAME) {
938 if (this.shortLogName == null) {
939 this.shortLogName = this.computeShortName();
940 }
941 buf.append('{').append(this.shortLogName).append("} ");
942 }
943
944
945 buf.append(message);
946
947
948 if (throwable != null) {
949 buf.append('\n').append(ExceptionUtils.getFullStackTrace(throwable)
950 .trim());
951 }
952
953
954 buf.append(ChatColor.RESET);
955
956
957 logger.log(BukkitPluginLoggerAdapter.slf4jLevelIntToBukkitJULLevel(level),
958 BukkitColorMapper.map(buf.toString()));
959 }
960 }