AnyEvent
view release on metacpan or search on metacpan
lib/AnyEvent/Log.pm view on Meta::CPAN
=item C<all>
Enables all logging levels, i.e. filtering will effectively be switched
off (the default).
=item C<only>
Disables all logging levels, and changes the interpretation of following
level specifications to enable the specified level only.
Example: only enable debug messages for a context.
context=only,debug
=item C<except>
Enables all logging levels, and changes the interpretation of following
level specifications to disable that level. Rarely used.
Example: enable all logging levels except fatal and trace (this is rather
nonsensical).
filter=exept,fatal,trace
=item C<level>
Enables all logging levels, and changes the interpretation of following
level specifications to be "that level or any higher priority
message". This is the default.
Example: log anything at or above warn level.
filter=warn
# or, more verbose
filter=only,level,warn
=item C<1>..C<9> or a logging level name (C<error>, C<debug> etc.)
A numeric loglevel or the name of a loglevel will be interpreted according
to the most recent C<only>, C<except> or C<level> directive. By default,
specifying a logging level enables that and any higher priority messages.
=item C<+>I<context>
Attaches the named context as slave to the context.
=item C<+>
A lone C<+> detaches all contexts, i.e. clears the slave list from the
context. Anonymous (C<%name>) contexts have no attached slaves by default,
but package contexts have the parent context as slave by default.
Example: log messages from My::Module to a file, do not send them to the
default log collector.
My::Module=+,file=/tmp/mymodulelog
=back
Any character can be escaped by prefixing it with a C<\> (backslash), as
usual, so to log to a file containing a comma, colon, backslash and some
spaces in the filename, you would do this:
PERL_ANYEVENT_LOG='log=file=/some\ \:file\ with\,\ \\-escapes'
Since whitespace (which includes newlines) is allowed, it is fine to
specify multiple lines in C<PERL_ANYEVENT_LOG>, e.g.:
PERL_ANYEVENT_LOG="
filter=warn
AnyEvent::Debug=+%trace
%trace=only,trace,+log
" myprog
Also, in the unlikely case when you want to concatenate specifications,
use whitespace as separator, as C<::> will be interpreted as part of a
module name, an empty spec with two separators:
PERL_ANYEVENT_LOG="$PERL_ANYEVENT_LOG MyMod=debug"
=cut
for (my $spec = $ENV{PERL_ANYEVENT_LOG}) {
my %anon;
my $pkg = sub {
$_[0] eq "log" ? $LOG
: $_[0] eq "filter" ? $FILTER
: $_[0] eq "collect" ? $COLLECT
: $_[0] =~ /^%(.+)$/ ? ($anon{$1} ||= do { my $ctx = ctx undef; $ctx->[0] = $_[0]; $ctx })
: $_[0] =~ /^(.*?)(?:::)?$/ ? ctx "$1" # egad :/
: die # never reached?
};
/\G[[:space:]]+/gc; # skip initial whitespace
while (/\G((?:[^:=[:space:]]+|::|\\.)+)=/gc) {
my $ctx = $pkg->($1);
my $level = "level";
while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) {
for ("$1") {
if ($_ eq "stderr" ) { $ctx->log_to_warn;
} elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1");
} elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1");
} elsif (/^syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog ("$1");
} elsif ($_ eq "nolog" ) { $ctx->log_cb (undef);
} elsif (/^cap=(.+)/ ) { $ctx->cap ("$1");
} elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1"));
} elsif ($_ eq "+" ) { $ctx->slaves;
} elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0);
} elsif ($_ eq "all" ) { $ctx->level ("all");
} elsif ($_ eq "level" ) { $ctx->level ("all"); $level = "level";
} elsif ($_ eq "only" ) { $ctx->level ("off"); $level = "enable";
} elsif ($_ eq "except" ) { $ctx->level ("all"); $level = "disable";
} elsif (/^\d$/ ) { $ctx->$level ($_);
} elsif (exists $STR2LEVEL{$_} ) { $ctx->$level ($_);
} else { die "PERL_ANYEVENT_LOG ($spec): parse error at '$_'\n";
}
}
/\G,/gc or last;
}
( run in 2.843 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )