.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.42) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "Log::Contextual::WarnLogger 3pm" .TH Log::Contextual::WarnLogger 3pm "2022-06-15" "perl v5.34.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Log::Contextual::WarnLogger \- logger for libraries using Log::Contextual .SH "VERSION" .IX Header "VERSION" version 0.008001 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 7 \& package My::Package; \& use Log::Contextual::WarnLogger; \& use Log::Contextual qw( :log ), \& \-default_logger => Log::Contextual::WarnLogger\->new({ \& env_prefix => \*(AqMY_PACKAGE\*(Aq, \& levels => [ qw(debug info notice warning error critical alert emergency) ], \& }); \& \& # warns \*(Aq[info] program started\*(Aq if $ENV{MY_PACKAGE_TRACE} is set \& log_info { \*(Aqprogram started\*(Aq }; # no\-op because info is not in levels \& sub foo { \& # warns \*(Aq[debug] entered foo\*(Aq if $ENV{MY_PACKAGE_DEBUG} is set \& log_debug { \*(Aqentered foo\*(Aq }; \& ... \& } .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This module is a simple logger made for libraries using Log::Contextual. We recommend the use of this logger as your default logger as it is simple and useful for most users, yet users can use \*(L"set_logger\*(R" in Log::Contextual to override your choice of logger in their own code thanks to the way Log::Contextual works. .SH "METHODS" .IX Header "METHODS" .SS "new" .IX Subsection "new" Arguments: \f(CW\*(C`Dict[ env_prefix => Str, levels => List ] $conf\*(C'\fR .PP .Vb 1 \& my $l = Log::Contextual::WarnLogger\->new({ env_prefix => \*(AqBAR\*(Aq }); .Ve .PP or: .PP .Vb 4 \& my $l = Log::Contextual::WarnLogger\->new({ \& env_prefix => \*(AqBAR\*(Aq, \& levels => [ \*(Aqlevel1\*(Aq, \*(Aqlevel2\*(Aq ], \& }); .Ve .PP Creates a new logger object where \f(CW\*(C`env_prefix\*(C'\fR defines what the prefix is for the environment variables that will be checked for the log levels. .PP The log levels may be customized, but if not defined, these are used: .IP "trace" 4 .IX Item "trace" .PD 0 .IP "debug" 4 .IX Item "debug" .IP "info" 4 .IX Item "info" .IP "warn" 4 .IX Item "warn" .IP "error" 4 .IX Item "error" .IP "fatal" 4 .IX Item "fatal" .PD .PP For example, if \f(CW\*(C`env_prefix\*(C'\fR is set to \f(CW\*(C`FREWS_PACKAGE\*(C'\fR the following environment variables will be used: .PP .Vb 1 \& FREWS_PACKAGE_UPTO \& \& FREWS_PACKAGE_TRACE \& FREWS_PACKAGE_DEBUG \& FREWS_PACKAGE_INFO \& FREWS_PACKAGE_WARN \& FREWS_PACKAGE_ERROR \& FREWS_PACKAGE_FATAL .Ve .PP Note that \f(CW\*(C`UPTO\*(C'\fR is a convenience variable. If you set \&\f(CW\*(C`FOO_UPTO=TRACE\*(C'\fR it will enable all log levels. Similarly, if you set it to \f(CW\*(C`FATAL\*(C'\fR only fatal will be enabled. .ie n .SS "$level" .el .SS "\f(CW$level\fP" .IX Subsection "$level" Arguments: \f(CW@anything\fR .PP All of the following six methods work the same. The basic pattern is: .PP .Vb 2 \& sub $level { \& my $self = shift; \& \& warn "[$level] " . join qq{\en}, @_; \& if $self\->is_$level; \& } .Ve .PP \fItrace\fR .IX Subsection "trace" .PP .Vb 1 \& $l\->trace( \*(Aqentered method foo with args \*(Aq join q{,}, @args ); .Ve .PP \fIdebug\fR .IX Subsection "debug" .PP .Vb 1 \& $l\->debug( \*(Aqentered method foo\*(Aq ); .Ve .PP \fIinfo\fR .IX Subsection "info" .PP .Vb 1 \& $l\->info( \*(Aqstarted process foo\*(Aq ); .Ve .PP \fIwarn\fR .IX Subsection "warn" .PP .Vb 1 \& $l\->warn( \*(Aqpossible misconfiguration at line 10\*(Aq ); .Ve .PP \fIerror\fR .IX Subsection "error" .PP .Vb 1 \& $l\->error( \*(Aqnon\-numeric user input!\*(Aq ); .Ve .PP \fIfatal\fR .IX Subsection "fatal" .PP .Vb 1 \& $l\->fatal( \*(Aq1 is never equal to 0!\*(Aq ); .Ve .PP If different levels are specified, appropriate functions named for your custom levels work as you expect. .PP \&\fBNote:\fR \f(CW\*(C`fatal\*(C'\fR does not call \f(CW\*(C`die\*(C'\fR for you, see \*(L"\s-1EXCEPTIONS AND ERROR HANDLING\*(R"\s0 in Log::Contextual .SS "is_$level" .IX Subsection "is_$level" All of the following six functions just return true if their respective environment variable is enabled. .PP \fIis_trace\fR .IX Subsection "is_trace" .PP .Vb 1 \& say \*(Aqtracing\*(Aq if $l\->is_trace; .Ve .PP \fIis_debug\fR .IX Subsection "is_debug" .PP .Vb 1 \& say \*(Aqdebuging\*(Aq if $l\->is_debug; .Ve .PP \fIis_info\fR .IX Subsection "is_info" .PP .Vb 1 \& say q{info\*(Aqing} if $l\->is_info; .Ve .PP \fIis_warn\fR .IX Subsection "is_warn" .PP .Vb 1 \& say \*(Aqwarning\*(Aq if $l\->is_warn; .Ve .PP \fIis_error\fR .IX Subsection "is_error" .PP .Vb 1 \& say \*(Aqerroring\*(Aq if $l\->is_error; .Ve .PP \fIis_fatal\fR .IX Subsection "is_fatal" .PP .Vb 1 \& say q{fatal\*(Aqing} if $l\->is_fatal; .Ve .PP If different levels are specified, appropriate is_$level functions work as you would expect. .SH "AUTHOR" .IX Header "AUTHOR" Arthur Axel \*(L"fREW\*(R" Schmidt .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" This software is copyright (c) 2018 by Arthur Axel \*(L"fREW\*(R" Schmidt. .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.