refactor_loggers #1

Merged
medvedych merged 3 commits from refactor_loggers into master 2023-03-17 22:37:07 +03:00
12 changed files with 139 additions and 99 deletions
Showing only changes of commit 262253d670 - Show all commits

View file

@ -2,27 +2,35 @@ package Log::Mini;
use strict;
use warnings;
use Module::Load qw/load/;
our $VERSION = "0.2.1";
require Carp;
sub new {
our $VERSION = "0.3.0";
sub new
{
shift;
my ( $type, @args ) = @_;
my ($type, @args) = @_;
@args = () unless @args;
$type = 'stderr' unless defined $type;
if ( $type eq 'file' ) {
require Log::Mini::LoggerFILE;
return Log::Mini::LoggerFILE->new(@_);
}
elsif ( $type eq 'null' ) {
require Log::Mini::LoggerNULL;
return Log::Mini::LoggerNULL->new(@args);
}
else {
require Log::Mini::LoggerSTDERR;
return Log::Mini::LoggerSTDERR->new(@args);
if ($type eq 'file') {
unshift(@args, $type);
}
my $module_name = sprintf('Log::Mini::Logger::%s', uc($type));
my $logger;
eval {
load $module_name;
$logger = $module_name->new(@args);
} or do { Carp::croak(sprintf("Failed to load adapter: %s, %s\n", $type, $@)) };
return $logger;
}
1;

View file

@ -1,12 +1,13 @@
package Log::Mini::LoggerBase;
package Log::Mini::Logger::Base;
use strict;
use warnings;
use Carp qw(croak);
use Carp qw(croak);
use List::Util qw(first);
use Time::Moment;
my $LEVELS = {
error => 1,
warn => 2,
@ -15,9 +16,8 @@ my $LEVELS = {
trace => 5
};
sub new {
# say STDERR Dumper(\@_);
sub new
{
my $class = shift;
my (%params) = @_;
@ -29,39 +29,42 @@ sub new {
return $self;
}
sub set_level {
sub set_level
{
my $self = shift;
my ($new_level) = @_;
croak('Unknown log level')
unless first { $new_level eq $_ } keys %$LEVELS;
unless $LEVELS->{$new_level};
$self->{'level'} = $new_level;
return;
}
sub level {
sub level
{
my $self = shift;
return $self->{level} || 'error';
}
sub log { return shift->_log( shift, @_) }
sub info { return shift->_log( 'info', @_ ) }
sub error { return shift->_log( 'error', @_ ) }
sub warn { return shift->_log( 'warn', @_ ) }
sub debug { return shift->_log( 'debug', @_ ) }
sub trace { return shift->_log( 'trace', @_ ) }
sub log { return shift->_log(shift, @_) }
sub info { return shift->_log('info', @_) }
sub error { return shift->_log('error', @_) }
sub warn { return shift->_log('warn', @_) }
sub debug { return shift->_log('debug', @_) }
sub trace { return shift->_log('trace', @_) }
sub _log {
my $self = shift;
my $level = shift;
sub _log
{
my $self = shift;
my $level = shift;
my $message = shift;
return if $LEVELS->{$level} > $LEVELS->{ $self->{'level'} };
return if $LEVELS->{$level} > $LEVELS->{$self->{'level'}};
my $time = Time::Moment->now->strftime('%Y-%m-%d %T%3f');
my $time = $self->_getCurrentTime();
my $text = sprintf("%s [%s] %s\n", $time, $level, $message);
$text = sprintf($text, @_) if (@_);
@ -73,4 +76,9 @@ sub _log {
sub _print { croak 'Not implemented!' }
sub _getCurrentTime
{
return Time::Moment->now->strftime('%Y-%m-%d %T%3f');
}
1;

View file

@ -1,13 +1,13 @@
package Log::Mini::LoggerFILE;
package Log::Mini::Logger::FILE;
use strict;
use warnings;
use IO::Handle;
use base 'Log::Mini::Logger::Base';
use base 'Log::Mini::LoggerBase';
sub new {
sub new
{
my $self = shift->SUPER::new(@_);
my (%params) = @_;
@ -24,16 +24,18 @@ sub new {
return $self;
}
sub _print {
sub _print
{
my $self = shift;
my $fh = $self->{fh};
print $fh @_;
}
sub DESTROY {
sub DESTROY
{
close shift->{'fh'};
return;
}
1;

View file

@ -0,0 +1,12 @@
package Log::Mini::Logger::NULL;
use strict;
use warnings;
use base 'Log::Mini::Logger::Base';
sub _log {
return;
}
1;

View file

@ -0,0 +1,13 @@
package Log::Mini::Logger::STDERR;
use strict;
use warnings;
use base 'Log::Mini::Logger::Base';
sub _print
{
print STDERR $_[1];
}
1;

View file

@ -1,12 +0,0 @@
package Log::Mini::LoggerNULL;
use strict;
use warnings;
use base 'Log::Mini::LoggerBase';
sub _log {
return;
}
1;

View file

@ -1,12 +0,0 @@
package Log::Mini::LoggerSTDERR;
use strict;
use warnings;
use base 'Log::Mini::LoggerBase';
sub _print {
print STDERR $_[1];
}
1;

View file

@ -7,28 +7,37 @@ use Test::Fatal;
use File::Temp;
use Log::Mini;
subtest 'creates stderr logger' => sub {
my $logger = Log::Mini->new('stderr');
isa_ok $logger, 'Log::Mini::LoggerSTDERR';
isa_ok $logger, 'Log::Mini::Logger::STDERR';
};
subtest 'creates null logger' => sub {
my $logger = Log::Mini->new('null');
isa_ok $logger, 'Log::Mini::LoggerNULL';
isa_ok $logger, 'Log::Mini::Logger::NULL';
};
subtest 'creates file logger' => sub {
my $file = File::Temp->new;
my $file = File::Temp->new;
my $logger = Log::Mini->new('file' => $file->filename);
isa_ok $logger, 'Log::Mini::LoggerFILE';
isa_ok $logger, 'Log::Mini::Logger::FILE';
};
subtest 'return STDERR on unknown logger' => sub {
my $logger = Log::Mini->new('unknown');
isa_ok $logger, 'Log::Mini::LoggerSTDERR';
subtest 'return STDERR on no logger name given' => sub {
my $logger = Log::Mini->new();
isa_ok $logger, 'Log::Mini::Logger::STDERR';
};
done_testing;
subtest 'throw on unknown logger adapter' => sub {
like(
exception { Log::Mini->new('unknown'); },
qr/^Failed to load adapter: unknown, .*/,
"the code died on unknown adapter",
);
};
done_testing;

View file

@ -5,6 +5,7 @@ use warnings;
use Test::More;
use Test::Fatal;
subtest 'creates correct object' => sub {
isa_ok(LoggerTest->new, 'LoggerTest');
};
@ -26,7 +27,7 @@ subtest 'sets log level' => sub {
subtest 'not throws when known log level' => sub {
my $log = LoggerTest->new;
for my $level (qw/error warn debug/) {
for my $level (qw/error warn debug info trace/) {
ok !exception { $log->set_level($level) };
}
};
@ -39,19 +40,19 @@ subtest 'throws exception when invalid log level' => sub {
subtest 'prints formatted line' => sub {
my $output = [];
my $log = _build_logger(output => $output);
my $log = _build_logger(output => $output);
for my $level (qw/error warn debug/) {
for my $level (qw/error warn debug info trace/) {
$log->set_level($level);
$log->$level('message');
like $output->[-1],
qr/\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d.\d{3} \[$level\] message/;
like $output->[-1], qr/\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d.\d{3} \[$level\] message/;
}
};
subtest 'logs when level is higher' => sub {
subtest 'log all suitable levels' => sub {
my $output = [];
my $log = _build_logger(output => $output);
my $log = _build_logger(output => $output);
my $levels = {
error => [qw/error/],
@ -73,11 +74,13 @@ subtest 'logs when level is higher' => sub {
subtest 'not logs when level is lower' => sub {
my $output = [];
my $log = _build_logger(output => $output);
my $log = _build_logger(output => $output);
my $levels = {
error => [qw/warn debug/],
warn => [qw/debug/],
error => [qw/warn info debug trace/],
warn => [qw/info debug trace/],
info => [qw/debug trace/],
debug => [qw/trace/],
};
for my $level (keys %$levels) {
@ -90,7 +93,8 @@ subtest 'not logs when level is lower' => sub {
}
};
sub _build_logger {
sub _build_logger
{
my $logger = LoggerTest->new(@_);
$logger->set_level('debug');
return $logger;
@ -99,9 +103,10 @@ sub _build_logger {
done_testing;
package LoggerTest;
use base 'Log::Mini::LoggerBase';
use base 'Log::Mini::Logger::Base';
sub new {
sub new
{
my $self = shift->SUPER::new(@_);
my (%params) = @_;
@ -110,7 +115,8 @@ sub new {
return $self;
}
sub _print {
sub _print
{
my $self = shift;
push @{$self->{output}}, @_;

View file

@ -5,11 +5,11 @@ use warnings;
use Test::More;
use Test::Fatal;
use File::Temp;
use Log::Mini::LoggerFILE;
use Log::Mini::Logger::FILE;
subtest 'creates correct object' => sub {
isa_ok(Log::Mini::LoggerFILE->new, 'Log::Mini::LoggerFILE');
isa_ok(Log::Mini::Logger::FILE->new, 'Log::Mini::Logger::FILE');
};
subtest 'prints to file' => sub {
@ -79,7 +79,7 @@ sub _slurp {
}
sub _build_logger {
my $logger = Log::Mini::LoggerFILE->new(@_);
my $logger = Log::Mini::Logger::FILE->new(@_);
$logger->set_level('debug');
return $logger;
}

View file

@ -5,10 +5,11 @@ use warnings;
use Test::More;
use Test::Fatal;
use Capture::Tiny qw(capture_stderr);
use Log::Mini::LoggerSTDERR;
use Log::Mini::Logger::STDERR;
subtest 'creates correct object' => sub {
isa_ok(Log::Mini::LoggerSTDERR->new, 'Log::Mini::LoggerSTDERR');
isa_ok(Log::Mini::Logger::STDERR->new, 'Log::Mini::Logger::STDERR');
};
subtest 'prints to stderr' => sub {
@ -50,7 +51,7 @@ subtest 'prints sprintf formatted line' => sub {
};
sub _build_logger {
my $logger = Log::Mini::LoggerSTDERR->new;
my $logger = Log::Mini::Logger::STDERR->new;
$logger->set_level('debug');
return $logger;
}

View file

@ -8,15 +8,20 @@ use File::Temp;
use Log::Mini;
subtest 'creates correct object LoggerFILE' => sub {
subtest 'creates correct object Logger::FILE' => sub {
my $file = File::Temp->new;
isa_ok(Log::Mini->new( file => $file->filename), 'Log::Mini::LoggerFILE');
isa_ok(Log::Mini->new(file => $file->filename), 'Log::Mini::Logger::FILE');
isa_ok(Log::Mini::Logger::FILE->new(file => $file->filename), 'Log::Mini::Logger::FILE');
};
subtest 'creates correct object LoggerSTDERR' => sub {
isa_ok(Log::Mini->new('stderr', level => 'debug'), 'Log::Mini::LoggerSTDERR');
isa_ok(Log::Mini::LoggerSTDERR->new(level => 'debug'), 'Log::Mini::LoggerSTDERR');
subtest 'creates correct object Logger::STDERR' => sub {
isa_ok(Log::Mini->new('stderr', level => 'debug'), 'Log::Mini::Logger::STDERR');
isa_ok(Log::Mini::Logger::STDERR->new(level => 'debug'), 'Log::Mini::Logger::STDERR');
};
done_testing;
subtest 'creates correct object Logger::NULL' => sub {
isa_ok(Log::Mini->new('null', level => 'debug'), 'Log::Mini::Logger::NULL');
isa_ok(Log::Mini::Logger::NULL->new(level => 'debug'), 'Log::Mini::Logger::NULL');
};
done_testing;