The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

use 5.008001;
use strict;
$Log::Any::Adapter::Redis::VERSION = '1.000';
# ABSTRACT: Simple adapter for logging to redis
use RedisDB;
my $trace_level = Log::Any::Adapter::Util::numeric_level('trace');
sub new {
my ( $class, @args ) = @_;
return $class->SUPER::new(
host => 'localhost',
port => 6379,
database => 0,
ignore_reply => 0,
log_level => $trace_level,
log_hostname => 0,
log_pid => 0,
@args
);
}
sub init {
my $self = shift;
$self->{log_level} = Log::Any::Adapter::Util::numeric_level( $self->{log_level} )
unless $self->{log_level} =~ /^\d+$/;
if ( !exists $self->{redis_db} || ref( $self->{redis_db} ) ne 'RedisDB' ) {
$self->{redis_db} = RedisDB->new(
host => $self->{host},
port => $self->{port},
database => $self->{database}
);
$self->{key} = 'LOG' if !exists $self->{key};
}
}
foreach my $method ( Log::Any::Adapter::Util::logging_methods() ) {
no strict 'refs';
my $method_level = Log::Any::Adapter::Util::numeric_level($method);
*{$method} = sub {
my ( $self, $text ) = @_;
return if $method_level > $self->{log_level};
my $msg = sprintf( "[%s]", scalar(localtime) );
$msg .= sprintf( "[%s]", hostname() ) if $self->{log_hostname};
$msg .= sprintf( "[%s]", $$ ) if $self->{log_pid};
$msg .= sprintf( " %s", $text );
if ( $self->{ignore_reply} ) {
$self->{redis_db}->send_command( 'rpush', $self->{key}, $msg, RedisDB::IGNORE_REPLY );
} else {
$self->{redis_db}->rpush( $self->{key}, $msg );
}
};
}
foreach my $method ( Log::Any::Adapter::Util::detection_methods() ) {
no strict 'refs';
my $base = substr( $method, 3 );
my $method_level = Log::Any::Adapter::Util::numeric_level($base);
*{$method} = sub {
return !!( $method_level <= $_[0]->{log_level} );
};
}
!0; # 3a59124cfcc7ce26274174c962094a20
__END__
=pod
=encoding UTF-8
=head1 NAME
Log::Any::Adapter::Redis - Simple adapter for logging to redis
=head1 SYNOPSIS
use Log::Any::Adapter ('Redis',
host => 'localhost',
port => '6379',
key => 'LOG', # list name
log_hostname => 0,
log_pid => 0,
database => 0
);
# or, using the defaults
use Log::Any::Adapter ('Redis');
# or
use Log::Any::Adapter;
...
Log::Any::Adapter->set('Redis',
host => 'localhost',
port => '6379',
key => 'LOG',
log_hostname => 0,
log_pid => 0,
database => 0
);
# with minimum level 'warn'
use Log::Any::Adapter (
'Redis', log_level => 'warn'
);
# re-use existing RedisDB object
use Log::Any::Adapter (
'Redis', redis_db => $my_redis_db
);
=head1 DESCRIPTION
This simple L<Log::Any|Log::Any> adapter logs (RPUSH) each message to the
specified list in redis, with a datestamp prefix. This Approach is useful
when you have several processes, maybe even running on different machines,
and need a fast, central logging solution. An example logwriter is included
in the examples.
The C<log_level> attribute may be set to define a minimum level to log.
Category is ignored.
=head1 SEE ALSO
L<Log::Any|Log::Any>, L<Log::Any::Adapter|Log::Any::Adapter>
=head1 AUTHOR
Michael Langner, mila at cpan dot org
The module is heavily based on Log::Any::Adapter::File by Jonathan Swartz and David Golden.
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by Michael Langner.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut