22
33import static io .goodforgod .slf4j .simplelogger .SimpleLoggerProperties .PREFIX_LOG ;
44
5- import java .io .PrintWriter ;
5+ import java .io .* ;
66import java .time .LocalDateTime ;
77import java .time .LocalTime ;
88import org .slf4j .Logger ;
@@ -207,7 +207,7 @@ private void log(int level, String message, Throwable throwable) {
207207 ? Thread .currentThread ().getName ()
208208 : null ;
209209
210- final int length = predictBuilderLength (message , threadName );
210+ final int length = predictBuilderLength (message , threadName , throwable );
211211 final StringBuilder builder = new StringBuilder (length );
212212
213213 // Append date-time if so configured
@@ -274,6 +274,10 @@ private void log(int level, String message, Throwable throwable) {
274274 }
275275
276276 private void logEnvironment (StringBuilder builder ) {
277+ if (CONFIG .environments .isEmpty ()) {
278+ return ;
279+ }
280+
277281 if (CONFIG .environmentsOnStart != null ) {
278282 builder .append (CONFIG .environmentsOnStart );
279283 } else {
@@ -305,11 +309,13 @@ private void logEnvironment(StringBuilder builder) {
305309 }
306310 }
307311
308- private int predictBuilderLength (String message , String threadName ) {
312+ private int predictBuilderLength (String message , String threadName , Throwable throwable ) {
309313 int length = 14 ;
310314
311315 if (message != null )
312316 length += message .length ();
317+ if (throwable != null )
318+ length += 2048 ;
313319 if (threadName != null )
314320 length += threadName .length ();
315321 if (CONFIG .showDateTime )
@@ -320,8 +326,8 @@ private int predictBuilderLength(String message, String threadName) {
320326 } else {
321327 for (String env : CONFIG .environments ) {
322328 length += (CONFIG .environmentShowName )
323- ? env .length () + 12
324- : 12 ;
329+ ? env .length () + 6
330+ : 10 ;
325331 }
326332 }
327333
@@ -338,33 +344,33 @@ private int predictBuilderLength(String message, String threadName) {
338344
339345 protected String renderLevel (int level ) {
340346 switch (level ) {
341- case LOG_LEVEL_TRACE :
342- return "TRACE " ;
343- case LOG_LEVEL_DEBUG :
344- return "DEBUG " ;
345347 case LOG_LEVEL_INFO :
346348 return "INFO " ;
347349 case LOG_LEVEL_WARN :
348350 return "WARN " ;
349351 case LOG_LEVEL_ERROR :
350352 return "ERROR " ;
353+ case LOG_LEVEL_DEBUG :
354+ return "DEBUG " ;
355+ case LOG_LEVEL_TRACE :
356+ return "TRACE " ;
351357 default :
352358 throw new IllegalStateException ("Unrecognized level [" + level + "]" );
353359 }
354360 }
355361
356362 protected String renderLevelInBrackets (int level ) {
357363 switch (level ) {
358- case LOG_LEVEL_TRACE :
359- return "[TRACE] " ;
360- case LOG_LEVEL_DEBUG :
361- return "[DEBUG] " ;
362364 case LOG_LEVEL_INFO :
363365 return "[INFO] " ;
364366 case LOG_LEVEL_WARN :
365367 return "[WARN] " ;
366368 case LOG_LEVEL_ERROR :
367369 return "[ERROR] " ;
370+ case LOG_LEVEL_DEBUG :
371+ return "[DEBUG] " ;
372+ case LOG_LEVEL_TRACE :
373+ return "[TRACE] " ;
368374 default :
369375 throw new IllegalStateException ("Unrecognized level [" + level + "]" );
370376 }
@@ -377,16 +383,33 @@ protected String renderLevelInBrackets(int level) {
377383 * @param builder of logging message
378384 */
379385 void write (StringBuilder builder ) {
386+ final String message = builder .toString ();
387+ final byte [] bytes = (CONFIG .charset == null )
388+ ? message .getBytes ()
389+ : message .getBytes (CONFIG .charset );
390+
391+ final PrintStream printStream = getOutputStream ();
392+ synchronized (printStream ) {
393+ try {
394+ printStream .write (bytes );
395+ printStream .flush ();
396+ } catch (IOException e ) {
397+ // do nothing
398+ }
399+ }
400+ }
401+
402+ private PrintStream getOutputStream () {
403+ if (CONFIG .sameOutputChoice )
404+ return CONFIG .outputChoice .getTargetPrintStream ();
405+
380406 switch (currentLogLevel ) {
381407 case LOG_LEVEL_WARN :
382- CONFIG .outputChoiceWarn .getTargetPrintStream ().print (builder );
383- break ;
408+ return CONFIG .outputChoiceWarn .getTargetPrintStream ();
384409 case LOG_LEVEL_ERROR :
385- CONFIG .outputChoiceError .getTargetPrintStream ().print (builder );
386- break ;
410+ return CONFIG .outputChoiceError .getTargetPrintStream ();
387411 default :
388- CONFIG .outputChoice .getTargetPrintStream ().print (builder );
389- break ;
412+ return CONFIG .outputChoice .getTargetPrintStream ();
390413 }
391414 }
392415
@@ -402,6 +425,22 @@ private String computeShortName() {
402425 return name .substring (name .lastIndexOf ('.' ) + 1 );
403426 }
404427
428+ /**
429+ * For formatted messages, first substitute arguments and then log.
430+ *
431+ * @param level to log
432+ * @param format to parse message
433+ * @param arg1 to format
434+ */
435+ private void formatAndLog (int level , String format , Object arg1 ) {
436+ if (!isLevelEnabled (level )) {
437+ return ;
438+ }
439+
440+ final FormattingTuple tp = MessageFormatter .format (format , arg1 );
441+ log (level , tp .getMessage (), null );
442+ }
443+
405444 /**
406445 * For formatted messages, first substitute arguments and then log.
407446 *
@@ -416,7 +455,7 @@ private void formatAndLog(int level, String format, Object arg1, Object arg2) {
416455 }
417456
418457 final FormattingTuple tp = MessageFormatter .format (format , arg1 , arg2 );
419- log (level , tp .getMessage (), tp . getThrowable () );
458+ log (level , tp .getMessage (), null );
420459 }
421460
422461 /**
@@ -466,7 +505,7 @@ public void trace(String msg) {
466505 * format outlined above.
467506 */
468507 public void trace (String format , Object param1 ) {
469- formatAndLog (LOG_LEVEL_TRACE , format , param1 , null );
508+ formatAndLog (LOG_LEVEL_TRACE , format , param1 );
470509 }
471510
472511 /**
@@ -512,7 +551,7 @@ public void debug(String msg) {
512551 * format outlined above.
513552 */
514553 public void debug (String format , Object param1 ) {
515- formatAndLog (LOG_LEVEL_DEBUG , format , param1 , null );
554+ formatAndLog (LOG_LEVEL_DEBUG , format , param1 );
516555 }
517556
518557 /**
@@ -557,7 +596,7 @@ public void info(String msg) {
557596 * format outlined above.
558597 */
559598 public void info (String format , Object arg ) {
560- formatAndLog (LOG_LEVEL_INFO , format , arg , null );
599+ formatAndLog (LOG_LEVEL_INFO , format , arg );
561600 }
562601
563602 /**
@@ -603,7 +642,7 @@ public void warn(String msg) {
603642 * format outlined above.
604643 */
605644 public void warn (String format , Object arg ) {
606- formatAndLog (LOG_LEVEL_WARN , format , arg , null );
645+ formatAndLog (LOG_LEVEL_WARN , format , arg );
607646 }
608647
609648 /**
@@ -649,7 +688,7 @@ public void error(String msg) {
649688 * format outlined above.
650689 */
651690 public void error (String format , Object arg ) {
652- formatAndLog (LOG_LEVEL_ERROR , format , arg , null );
691+ formatAndLog (LOG_LEVEL_ERROR , format , arg );
653692 }
654693
655694 /**
0 commit comments