Added 'autoflush' to Catalyst::Log + enabled during setup
Henry Van Styn [Mon, 12 May 2014 18:36:57 +0000 (14:36 -0400)]
The default logger now has an 'autoflush' flag to cause log messages to
be written immediately instead of queued. This is now set to true during
setup so that log messages show up in real time (i.e. when using the
test server).

It is currently turned back off at the end of setup for backward
compatability (specifically for Static::Simple), however, mst has
suggested that we change the API such that plugins like S::S are
responsible for turning off autoflush themselves if they need to.

See in-code comments for more details.

lib/Catalyst.pm
lib/Catalyst/Log.pm [changed mode: 0644->0755]

index 48f4949..f9cae7a 100755 (executable)
@@ -1252,9 +1252,12 @@ EOF
     }
 
     $class->setup_finalize;
-    # Should be the last thing we do so that user things hooking
-    # setup_finalize can log..
-    $class->log->_flush() if $class->log->can('_flush');
+    
+    # Turn autoflush back off once setup is finished.
+    # TODO: this is being done purely for Static::Simple (legacy API), and has been suggested by
+    # mst to be removed and require/update Static::Simple to set this flag itself
+    $class->log->autoflush(0) if ($class->log->can('autoflush'));
+
     return $class || 1; # Just in case someone named their Application 0...
 }
 
@@ -2947,6 +2950,9 @@ sub setup_log {
     unless ( $class->log ) {
         $class->log( Catalyst::Log->new(keys %levels) );
     }
+    
+    # Turn on autoflush by default:
+    $class->log->autoflush(1) if ($class->log->can('autoflush'));
 
     if ( $levels{debug} ) {
         Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
old mode 100644 (file)
new mode 100755 (executable)
index b834a79..85613e3
@@ -13,6 +13,7 @@ our %LEVEL_MATCH = (); # Stored as additive, thus debug = 31, warn = 30 etc
 has level => (is => 'rw');
 has _body => (is => 'rw');
 has abort => (is => 'rw');
+has autoflush => (is => 'rw');
 has _psgi_logger => (is => 'rw', predicate => '_has_psgi_logger', clearer => '_clear_psgi_logger');
 has _psgi_errors => (is => 'rw', predicate => '_has_psgi_errors', clearer => '_clear_psgi_errors');
 
@@ -118,6 +119,9 @@ sub _log {
         $body .= sprintf( "[%s] %s", $level, $message );
         $self->_body($body);
     }
+    if( $self->autoflush && !$self->abort ) {
+      $self->_flush;
+    }
 }
 
 sub _flush {
@@ -284,6 +288,14 @@ to use Log4Perl or another logger, you should call it like this:
 
     $c->log->abort(1) if $c->log->can('abort');
 
+=head2 autoflush
+
+When enabled, messages are written to the log immediately instead of queued
+until the end of the request. By default, autoflush is enabled during setup,
+but turned back off thereafter. This is done purely for legacy support,
+specifically for L<Catalyst::Plugin::Static::Simple>, and may be changed in
+the future.
+
 =head2 _send_to_log
 
  $log->_send_to_log( @messages );