Merge remote-tracking branch 'upstream/master'
Henry Van Styn [Mon, 12 May 2014 21:37:56 +0000 (17:37 -0400)]
lib/Catalyst.pm
lib/Catalyst/Log.pm [changed mode: 0644->0755]

index 48f4949..6bc7e3d 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(undef) 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..2418302
@@ -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');
 
@@ -107,8 +108,9 @@ sub _log {
     my $self    = shift;
     my $level   = shift;
     my $message = join( "\n", @_ );
+    my $ret;
     if ($self->can('_has_psgi_logger') and $self->_has_psgi_logger) {
-        $self->_psgi_logger->({
+        $ret = $self->_psgi_logger->({
                 level => $level,
                 message => $message,
             });
@@ -116,8 +118,12 @@ sub _log {
         $message .= "\n" unless $message =~ /\n$/;
         my $body = $self->_body;
         $body .= sprintf( "[%s] %s", $level, $message );
-        $self->_body($body);
+        $ret = $self->_body($body);
     }
+    if( $self->autoflush && !$self->abort ) {
+      $self->_flush;
+    }
+    return $ret;
 }
 
 sub _flush {
@@ -284,6 +290,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 );