From: Mike S. <m...@pe...> - 2007-05-24 08:10:59
|
On Thu, 24 May 2007, Chris Baxter wrote: > I've been working an a little web application, and needed to write a new > appender. I don't know if there is already a way to do something like > this. Anyway I thought I'd share it. > > Basically the rationale was that part of the code can either be run in a > production environment and log any errors to a database for later use, > or it can be run in 'test mode' from an administration interface, where > debugging messages are passed back to the user in a process report. Sounds like a good idea. I was wondering about the implementation, though: You seem to be mixing the 'appender' and 'layout' concepts although they are orthogonal in Log4perl. In Log4perl, the end user determines the layout of a message, regardless of which appender is going to be used. Having the appender use a predefined layout deprives the user of this choice. Any chance you could keep the two concepts separate? -- Mike Mike Schilli m...@pe... > > The usage is outlined in the Synopsis below, and it seams to work quite > well. Any comments or suggestions would be greatly appreciated. > > Also, I would like to publish this on my "please give me a better job" > website. Does anyone object to this (esp. Mike Schilli and Kevin Goess - > have I given you appropriate attribution?) > > cheers > --chris > > > > package Log::Log4perl::Appender::Array; > our @ISA = qw(Log::Log4perl::Appender); > use Data::Dumper; > ################################################## > # Log dispatcher writing to an arrayref > ################################################## > > ################################################## > sub new { > ################################################## > my $proto = shift; > my $class = ref $proto || $proto; > my %params = @_; > > my $self = { > name => "Array Dispatcher", > array=> [], > params => \%params, > }; > > bless $self, $class; > } > > ################################################## > sub log { > ################################################## > my $self = shift; > my %params = @_; > my $newhash = {}; > > foreach my $key (keys %{$self->{params}{keys}}) { > if ($self->{params}{keys}{$key} =~ /^VAL_(\d)/) { > $newhash->{$key} = $params{message}[$1-1]; > } else { > my $conv = Log::Log4perl::Layout::PatternLayout->new( > { > ConversionPattern => { > value => $self->{params}{keys}{$key} > } > } > ); > $newhash->{$key} =$conv->render( > $params{message}, > $params{log4p_category}, > $params{log4p_level}, > 5 + $Log::Log4perl::caller_depth, > ); > } > } > push (@{$self->{array}}, {params => \%params, values => $newhash }); > } > > ################################################## > sub array { > ################################################## > my($self, $level) = @_; > > if ($level) { > return [ > map { $_->{values} } > grep { $_->{params}{level} > ($level - 1) } > @{$self->{array}} > ]; > } else { > return [ > map { $_->{values} } > @{$self->{array}} > ]; > } > } > > ################################################## > sub reset { > ################################################## > my ($self) = @_; > > $self->{array} = []; > } > 1; > > __END__ > > =head1 NAME > > Log::Log4perl::Appender::Array - Append to aan Array > > =head1 SYNOPSIS > > my $config = <<'EOT'; > log4perl.rootLogger=DEBUG, DebugArray > > log4perl.appender.DebugArray = Log::Log4perl::Appender::Array > > #Set up the keys for the hash > #Use VAL_1, VAL_2, etc for the values passed to the log > statement > log4perl.appender.DebugArray.keys.timestamp = %d > log4perl.appender.DebugArray.keys.category = %c > log4perl.appender.DebugArray.keys.priority = %p > log4perl.appender.DebugArray.keys.customer = VAL_1 > log4perl.appender.DebugArray.keys.message = VAL_2 > > #just pass through the array of message items in the log > statement > log4perl.appender.DebugArray.layout = > Log::Log4perl::Layout::NoopLayout > log4perl.appender.DebugArray.warp_message = 0 > > > > # Append to the array > $logger->warn( $custid, 'big problem!!'); > > # Retrieve the result > my $appender = Log::Log4perl::appender_by_name('DebugArray'); > my $result = $appender->array($level); #$level is optional - if > omitted the entire array is returned > > # Reset the buffer > $appender->reset(); > > =head1 DESCRIPTION > > This is a simple appender based heavily on the DBI Appender by Kevin > Goess and the String appender by Mike Schilli. > It's designed to work in conjunction with the DBI appender, such that > the same modules can log to the Array appender in > a test environment and the debugging values can be returned directly to > the user without being permanently recorded, while > in a production environment error logs can be recorded in a database (or > to the file system). > > > =head1 SEE ALSO > > =head1 AUTHOR > > Chris Baxter <E<lt>cp...@ge...E<gt> > > =cut > > > > ------------------------------------------------------------------------- > This SF.net email is sponsored by DB2 Express > Download DB2 Express C - the FREE version of DB2 express and take > control of your XML. No limits. Just data. Click to get it now. > http://sourceforge.net/powerbar/db2/ > _______________________________________________ > log4perl-devel mailing list > log...@li... > https://lists.sourceforge.net/lists/listinfo/log4perl-devel > |