From: Henry Van Styn Date: Mon, 12 May 2014 21:37:56 +0000 (-0400) Subject: Merge remote-tracking branch 'upstream/master' X-Git-Tag: 5.90065~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=3df135345bddeffe439c485a021b798baea88575;hp=2d6d24356b60aee54cfc81afafdaaccdc3c016db Merge remote-tracking branch 'upstream/master' --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 48f4949..6bc7e3d 100755 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -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 }); diff --git a/lib/Catalyst/Log.pm b/lib/Catalyst/Log.pm old mode 100644 new mode 100755 index b834a79..2418302 --- a/lib/Catalyst/Log.pm +++ b/lib/Catalyst/Log.pm @@ -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, and may be changed in +the future. + =head2 _send_to_log $log->_send_to_log( @messages );