NAME
MooX::Role::Chatty - Simple way to generate progress messages
SYNOPSIS
package My::Worker;
use Moo 2;
with 'MooX::Role::Chatty';
sub munge_widget {
...
# Produce informational message
$self->remark("Starting to munge widget #$ct\n") if $self->verbose;
...
# More detailed trace; output only if $self->verbose >= 2
$self->remark({ level => 2,
message => "Munging step 3 yielded $result\n" });
# Ditto for level 3, with simple formatting
$self->remark({ level => 3,
message => [ "Munging params: %d, %d, %s\n",
$gain, $threshold, $algorithm ] });
}
# Or use Log::Any-style API with compatible logger
sub munge_widget_more {
...
$self->logger->notice("Starting to munge widget #$ct\n");
...
$self->logger->info("Munging step 3 yielded $result\n");
$self->logger->debugf("Munging params: %d, %d, %s\n",
$gain, $threshold, $algorithm);
# Logs even when $self->verbose == 0
$self->logger->emergency("The sky is falling!")
}
# Elsewhere
my $worker = My::Worker->new(verbose => 2, ...);
$worker->munge_widget(...); # Sit back and watch log
DESCRIPTION
One of the common uses for logging packages is providing feedback to the
user about the progress of long-running operations, or about details of
what the program is doing to aid in debugging. MooX::Role::Chatty aims
to provide a few simple, lightweight tools you can use to make this job
a bit easier. It does not provide logging facilities itself, just a way
to connect to them, and to let the user specify how much information she
wants to see.
In keeping with the idea of TMTOWTDI, there are a few different ways to
use MooX::Role::Chatty. The simplest is to examine the "verbose"
attribute directly in your code, and call "remark" whenever you want to
say something based on the current verbosity level. If you prefer
labelling your logging calls by name, you can also call "logger" to get
at the logging engine, on which you can call any of the logging methods
it supports.
MANAGING LOGGERS
MooX::Role::Chatty tries to make the common cases easy. To that end, you
don't need to worry about setting up "logger" if you don't want to. IF
you haven't explicitly set this attribute, the first time you need it
(by calling "logger" or "remark") a default logger will be instantiated
for you. This logger is a Log::Any::Proxy, so you can call any of the
methods supported by Log::Any to generate messages. A corollary of this
behavior is that you have to have Log::Any installed, or a fatal error
occurs.
A brief timestamp is prepended to each line of the message. The logger
is connected to a Log::Any::Adapter::Carp adapter that passes on logged
messages but suppresses file/line information. The result is that log
messages are sent to STDERR, though you can redirect them via
$SIG{__WARN__} if you want.
The "verbose" attribute determines the level of logging: a level of 1
corresponds to a log level of "notice", 2 to "info", and so on. Although
less common, you can also go the other way: -1 corresponds to "warn", -2
to <error>, etc. A "verbose" level of 0 is special: it suppresses any
output from "remark", and of the Log::Any levels only "emergency" will
produce output.
If you want to use the default Log::Any::Proxy, but not the default
output adapter, you're free to register your own adapter to deal with
the MooX::Role::Chatty category. If you do, though, you need to manage
the adapter if you change "verbose", since Log::Any doesn't provide an
API to update the "log_level" of an existing adapter.
Finally, if Log::Any isn't your favorite among the plethora of logging
packages available, you can set "logger" yourself, to any object that
responds to "info" and "warn" methods. Most of the more established Perl
logging packages fill the bill, like Log::Dispatch or Log::Log4perl, in
addition to Log::Any. For that matter, if you like the behavior of
Log::Any but want output from your module to be different from
MooX::Role::Chartty logging elsewhere in your application, you can use
an instance of an adapter class directly. Again, if you set "logger"
directly, it's your responsibility to update the logger's behavior as
appropriate if you reset "verbose".
ATTRIBUTES
verbose
The level of output logged. Higher values typically indicate that
more detailed information should be provided.
For the behavior of the default logger in response to different
"verbose" settings, see "MANAGING LOGGERS".
Defaults to 0, and can be updated.
logger =item get_logger
The logging engine to be used for output.
The default is described above in "MANAGING LOGGERS".
Although you usually won't want to, you can update "logger", or
clear it via "clear_logger". In the latter case, if you output a
message before setting "logger", a new default logger will be
instantiated.
The "get_logger" alias is provided for ease of use by writers
accustomed to Log::Any; it is identical to "logger".
METHODS
In addition to the attribute accessors, one method is provided:
remark(*$info*)
If "verbose" is non-zero, produce a log message, based on the
contents of *$info* as described below. This message is output
output at the "notice" log level (or "info" if "logger" doesn't
respond to "notice").
* If *$info* is a hash reference, check the value associated with
the "level" key against "verbose". If "level" is less than
"verbose", do nothing. Otherwise, use the value associated with
the "message" key as the log message in place of *$info*
(subject to the two rules below).
Note: It's important, but sometimes confusing, to keep in mind
the difference between the target verbosity level (which is what
"level" specifies), and the actual call to the logger, which is
always at the "notice" (or "info") log level. In other words,
saying "<level =" -3>> does NOT get you a call to "critical".
* If *$info* is a simple scalar, use it as the log message.
* If *$info* is an array reference, use the contents as arguments
to format a message. For a Log::Any-based logger, they're simply
passed to "noticef". Otherwise, they're passed to "sprintf" in
perfunc, and the result passed to "notice" (or "info").
EXPORT
None.
SEE ALSO
MooX::Role::Logger, an even more lightweight way for your code to use
Log::Any.
Log::Any, Log::Any::Adapter::Carp
BUGS AND CAVEATS
Are there, for certain, but have yet to be cataloged.
VERSION
version 1.00
AUTHOR
Charles Bailey <
[email protected]>
COPYRIGHT AND LICENSE
Copyright (C) 2015 by Charles Bailey
This software may be used under the terms of the Artistic License
version 2 or the GNU Lesser General Public License version 3, as the
user prefers.