1 package Log::Contextual::WarnLogger;
3 # ABSTRACT: logger for libraries using Log::Contextual
10 my @default_levels = qw( trace debug info warn error fatal );
12 # generate subs to handle the default levels
13 # anything else will have to be handled by AUTOLOAD at runtime
15 for my $level (@default_levels) {
19 my $is_name = "is_$level";
23 $self->_log($level, @_)
29 return 1 if $ENV{$self->{env_prefix} . '_' . uc $level};
30 my $upto = $ENV{$self->{env_prefix} . '_UPTO'};
34 return $self->{level_num}{$level} >= $self->{level_num}{$upto};
44 (my $name = our $AUTOLOAD) =~ s/.*:://;
45 return if $name eq 'DESTROY';
47 # extract the log level from the sub name
48 my ($is, $level) = $name =~ m/^(is_)?(.+)$/;
49 my $is_name = "is_$level";
55 $self->_log($level, @_)
62 my $prefix_field = $self->{env_prefix} . '_' . uc $level;
63 return 1 if $ENV{$prefix_field};
65 # don't log if the variable specifically says not to
66 return 0 if defined $ENV{$prefix_field} and not $ENV{$prefix_field};
68 my $upto_field = $self->{env_prefix} . '_UPTO';
69 my $upto = $ENV{$upto_field};
74 croak "Unrecognized log level '$upto' in \$ENV{$upto_field}"
75 if not defined $self->{level_num}{$upto};
77 return $self->{level_num}{$level} >= $self->{level_num}{$upto};
80 # if we don't recognize this level and nothing says otherwise, log!
81 return 1 if not $self->{custom_levels};
87 my ($class, $args) = @_;
89 my $levels = $args->{levels};
90 croak 'invalid levels specification: must be non-empty arrayref'
91 if defined $levels and (ref $levels ne 'ARRAY' or !@$levels);
93 my $custom_levels = defined $levels;
94 $levels ||= [@default_levels];
97 @level_num{@$levels} = (0 .. $#{$levels});
101 level_num => \%level_num,
102 custom_levels => $custom_levels,
105 $self->{env_prefix} = $args->{env_prefix}
106 or die 'no env_prefix passed to Log::Contextual::WarnLogger->new';
113 my $message = join("\n", @_);
114 $message .= "\n" unless $message =~ /\n$/;
115 warn "[$level] $message";
125 use Log::Contextual::WarnLogger;
126 use Log::Contextual qw( :log ),
127 -default_logger => Log::Contextual::WarnLogger->new({
128 env_prefix => 'MY_PACKAGE',
129 levels => [ qw(debug info notice warning error critical alert emergency) ],
132 # warns '[info] program started' if $ENV{MY_PACKAGE_TRACE} is set
133 log_info { 'program started' }; # no-op because info is not in levels
135 # warns '[debug] entered foo' if $ENV{MY_PACKAGE_DEBUG} is set
136 log_debug { 'entered foo' };
144 This module is a simple logger made for libraries using L<Log::Contextual>. We
145 recommend the use of this logger as your default logger as it is simple and
146 useful for most users, yet users can use L<Log::Contextual/set_logger> to override
147 your choice of logger in their own code thanks to the way L<Log::Contextual>
154 Arguments: C<< Dict[ env_prefix => Str, levels => List ] $conf >>
156 my $l = Log::Contextual::WarnLogger->new({ env_prefix => 'BAR' });
160 my $l = Log::Contextual::WarnLogger->new({
162 levels => [ 'level1', 'level2' ],
165 Creates a new logger object where C<env_prefix> defines what the prefix is for
166 the environment variables that will be checked for the log levels.
168 The log levels may be customized, but if not defined, these are used:
186 For example, if C<env_prefix> is set to C<FREWS_PACKAGE> the following environment
187 variables will be used:
198 Note that C<UPTO> is a convenience variable. If you set
199 C<< FOO_UPTO=TRACE >> it will enable all log levels. Similarly, if you
200 set it to C<FATAL> only fatal will be enabled.
204 Arguments: C<@anything>
206 All of the following six methods work the same. The basic pattern is:
211 warn "[$level] " . join qq{\n}, @_;
217 $l->trace( 'entered method foo with args ' join q{,}, @args );
221 $l->debug( 'entered method foo' );
225 $l->info( 'started process foo' );
229 $l->warn( 'possible misconfiguration at line 10' );
233 $l->error( 'non-numeric user input!' );
237 $l->fatal( '1 is never equal to 0!' );
239 If different levels are specified, appropriate functions named for your custom
240 levels work as you expect.
244 All of the following six functions just return true if their respective
245 environment variable is enabled.
249 say 'tracing' if $l->is_trace;
253 say 'debuging' if $l->is_debug;
257 say q{info'ing} if $l->is_info;
261 say 'warning' if $l->is_warn;
265 say 'erroring' if $l->is_error;
269 say q{fatal'ing} if $l->is_fatal;
271 If different levels are specified, appropriate is_$level functions work as you