From: Henry Van Styn Date: Mon, 12 May 2014 18:36:57 +0000 (-0400) Subject: Added 'autoflush' to Catalyst::Log + enabled during setup X-Git-Tag: 5.90065~7 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=cae5df2cd085e4e4e2a1aca25e9842df4ea1519f Added 'autoflush' to Catalyst::Log + enabled during setup 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. --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 48f4949..f9cae7a 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(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 }); diff --git a/lib/Catalyst/Log.pm b/lib/Catalyst/Log.pm old mode 100644 new mode 100755 index b834a79..85613e3 --- 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'); @@ -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, and may be changed in +the future. + =head2 _send_to_log $log->_send_to_log( @messages );