3939import org .jruby .rack .RackContext ;
4040import org .jruby .rack .RackLogger ;
4141import org .jruby .rack .logging .ServletContextLogger ;
42- import org .jruby .rack .util .ExceptionUtils ;
4342import org .jruby .runtime .Block ;
4443import org .jruby .runtime .ObjectAllocator ;
4544import org .jruby .runtime .ThreadContext ;
@@ -59,6 +58,8 @@ public class Logger extends RubyObject { // implements RackLogger
5958
6059 // Logger::Severity :
6160
61+ private static final int LEVEL_NOT_SET = -1 ;
62+
6263 // Low-level information, mostly for developers.
6364 static final int DEBUG = 0 ;
6465 // Generic (useful) information about system operation.
@@ -72,9 +73,7 @@ public class Logger extends RubyObject { // implements RackLogger
7273 // An unknown message that should always be logged.
7374 static final int UNKNOWN = 5 ;
7475
75- private static final int NOT_SET = -1 ;
76-
77- private int level = NOT_SET ;
76+ private int level = LEVEL_NOT_SET ;
7877
7978 private RackLogger logger ; // the "real" logger
8079 private IRubyObject formatter = null ; // optional
@@ -123,6 +122,10 @@ public IRubyObject initialize_copy(final ThreadContext context, final IRubyObjec
123122
124123 @ JRubyMethod
125124 public IRubyObject real_logger (final ThreadContext context ) {
125+ RackLogger logger = this .logger ;
126+ if (logger instanceof RackLogger .DelegatingLogger ) {
127+ logger = ((RackLogger .DelegatingLogger ) logger ).unwrapLogger ();
128+ }
126129 return JavaEmbedUtils .javaToRuby (context .runtime , logger );
127130 }
128131
@@ -132,14 +135,16 @@ public RackLogger getRealLogger() {
132135
133136 @ JRubyMethod (name = "level" , alias = "sev_threshold" )
134137 public IRubyObject get_level (final ThreadContext context ) {
135- if ( this .level == NOT_SET ) return context .nil ;
136- return context .runtime .newFixnum (this .level );
138+ return this .level == LEVEL_NOT_SET ? context .nil : context .runtime .newFixnum (this .level );
137139 }
138140
139141 @ JRubyMethod (name = "level=" , alias = "sev_threshold=" )
140142 public IRubyObject set_level (final ThreadContext context , final IRubyObject level ) {
141- if ( level .isNil () ) { this .level = NOT_SET ; return level ; }
142- this .level = (int ) level .convertToInteger ("to_i" ).getLongValue ();
143+ if ( level .isNil () ) {
144+ this .level = LEVEL_NOT_SET ;
145+ return level ;
146+ }
147+ this .level = toInt (level );
143148 return get_level (context );
144149 }
145150
@@ -182,10 +187,9 @@ private boolean isEnabledFor(final int severity) {
182187 return isEnabledFor (severity , mapLevel (severity ));
183188 }
184189
185- private boolean isEnabledFor (final int severity ,
186- final RackLogger .Level loggerLevel ) {
190+ private boolean isEnabledFor (final int severity , final RackLogger .Level loggerLevel ) {
187191 if ( loggerLevel == null ) return level <= severity ;
188- if ( level == NOT_SET ) return logger .isEnabled (loggerLevel );
192+ if ( level == LEVEL_NOT_SET ) return logger .isEnabled (loggerLevel );
189193 return level <= severity && logger .isEnabled (loggerLevel );
190194 }
191195
@@ -337,9 +341,7 @@ public IRubyObject unknown(final ThreadContext context, final Block block) {
337341 public IRubyObject add (final ThreadContext context , final IRubyObject [] args , final Block block ) {
338342 int severity = UNKNOWN ;
339343 final IRubyObject sev = args [0 ];
340- if ( ! sev .isNil () ) {
341- severity = (int ) sev .convertToInteger ("to_i" ).getLongValue ();
342- }
344+ if ( !sev .isNil () ) severity = toInt (sev );
343345 IRubyObject msg ;
344346 if ( args .length > 1 ) {
345347 msg = args [1 ];
@@ -358,8 +360,7 @@ public IRubyObject add(final ThreadContext context, final IRubyObject severity,
358360 return context .runtime .newBoolean ( add (UNKNOWN , context , msg , block ) );
359361 }
360362
361- private boolean add (final int severity , final ThreadContext context ,
362- IRubyObject msg , final Block block ) {
363+ private boolean add (final int severity , final ThreadContext context , IRubyObject msg , final Block block ) {
363364 // severity ||= UNKNOWN
364365 final RackLogger .Level loggerLevel = mapLevel (severity );
365366
@@ -380,9 +381,8 @@ private boolean add(final int severity, final ThreadContext context,
380381 final long datetime = System .currentTimeMillis ();
381382 msg = format_message (context , severity , datetime , progname , msg );
382383 }
383- else if (msg instanceof RubyException error ) { // print backtrace for error
384- error .prepareIntegratedBacktrace (context , null );
385- doLog ( loggerLevel , ExceptionUtils .formatError (error ) );
384+ else if ( msg instanceof RubyException ex ) {
385+ doLog ( loggerLevel , ex .toThrowable () );
386386 return true ;
387387 }
388388 // @logdev.write(format_message(format_severity(severity), Time.now, progname, message))
@@ -414,16 +414,14 @@ public IRubyObject format_message(final ThreadContext context, final IRubyObject
414414 private IRubyObject format_message (final ThreadContext context ,
415415 final int severityVal , final long datetimeMillis ,
416416 final IRubyObject progname , final IRubyObject msg ) {
417- final IRubyObject severity =
418- RubyString .newStringShared (context .runtime , formatSeverity (severityVal ));
417+ final IRubyObject severity = RubyString .newStringShared (context .runtime , formatSeverity (severityVal ));
419418 final RubyTime datetime = RubyTime .newTime (context .runtime , datetimeMillis );
420419 return format_message (context , new IRubyObject [] { severity , datetime , progname , msg });
421420 }
422421
423422 @ JRubyMethod (visibility = Visibility .PRIVATE )
424423 public IRubyObject format_severity (final ThreadContext context , final IRubyObject sev ) {
425- final int severity = (int ) sev .convertToInteger ("to_i" ).getLongValue ();
426- return RubyString .newStringShared (context .runtime , formatSeverity (severity ));
424+ return RubyString .newStringShared (context .runtime , formatSeverity (toInt (sev )));
427425 }
428426
429427 private static final ByteList FORMATTED_DEBUG =
@@ -450,27 +448,27 @@ private static ByteList formatSeverity(final int severity) {
450448 };
451449 }
452450
451+ private static int toInt (final IRubyObject level ) {
452+ return level .convertToInteger ("to_i" ).getIntValue ();
453+ }
454+
453455 @ SuppressWarnings ("unchecked" )
454456 @ Override
455457 public <T > T toJava (Class <T > target ) {
456- // NOTE: maybe this is not a good idea ?!
457- if ( RackLogger .class == target ) return (T ) logger ;
458+ if ( RackLogger .class .isAssignableFrom (target ) && target .isInstance (logger ) ) return (T ) logger ;
458459 return super .toJava (target );
459460 }
460461
461- private void doLog (RackLogger .Level level , CharSequence message ) {
462- logger .log ( level , message );
462+ private void doLog (RackLogger .Level level , Throwable ex ) {
463+ logger .log (level , "" , ex );
463464 }
464465
465- private void doLog (RubyString message ) {
466- logger .log ( message );
466+ private void doLog (RackLogger . Level level , CharSequence message ) {
467+ logger .log (level , message );
467468 }
468469
469- // (old) BufferedLogger API compatibility :
470-
471- @ JRubyMethod (name = "flush" , alias = { "auto_flushing" , "auto_flushing=" })
472- public IRubyObject stub (final ThreadContext context ) {
473- return context .nil ;
470+ private void doLog (RubyString message ) {
471+ logger .log (message );
474472 }
475473
476474 /**
0 commit comments