ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Log.pm
Revision: 1.44
Committed: Mon Sep 26 11:32:19 2011 UTC (12 years, 8 months ago) by root
Branch: MAIN
Changes since 1.43: +22 -7 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     AnyEvent::Log - simple logging "framework"
4    
5     =head1 SYNOPSIS
6    
7 root 1.25 Simple uses:
8 root 1.24
9 root 1.8 use AnyEvent;
10    
11 root 1.44 AE::log trace => "going to call function abc";
12     AE::log debug => "the function returned 3";
13     AE::log info => "file soandso successfully deleted";
14     AE::log note => "wanted to create config, but config was alraedy created";
15     AE::log warn => "couldn't delete the file";
16     AE::log error => "failed to retrieve data";
17     AE::log crit => "the battery temperature is too hot";
18     AE::log alert => "the battery died";
19     AE::log fatal => "no config found, cannot continue"; # never returns
20 root 1.8
21 root 1.44 Log level overview:
22 root 1.41
23 root 1.44 LVL NAME SYSLOG PERL NOTE
24     1 fatal emerg exit system unusable, aborts program!
25     2 alert failure in primary system
26     3 critical crit failure in backup system
27     4 error err die non-urgent program errors, a bug
28     5 warn warning possible problem, not necessarily error
29     6 note notice unusual conditions
30     7 info normal messages, no action required
31     8 debug debugging messages for development
32     9 trace copious tracing output
33    
34     "Complex" uses (for speed sensitive code, e.g. trace/debug messages):
35 root 1.24
36 root 1.1 use AnyEvent::Log;
37    
38 root 1.8 my $tracer = AnyEvent::Log::logger trace => \$my $trace;
39    
40     $tracer->("i am here") if $trace;
41     $tracer->(sub { "lots of data: " . Dumper $self }) if $trace;
42    
43 root 1.25 Configuration (also look at the EXAMPLES section):
44 root 1.10
45 root 1.18 # set logging for the current package to errors and higher only
46 root 1.16 AnyEvent::Log::ctx->level ("error");
47 root 1.10
48 root 1.23 # set logging level to suppress anything below "notice"
49 root 1.18 $AnyEvent::Log::FILTER->level ("notice");
50 root 1.10
51 root 1.23 # send all critical and higher priority messages to syslog,
52     # regardless of (most) other settings
53     $AnyEvent::Log::COLLECT->attach (new AnyEvent::Log::Ctx
54     level => "critical",
55 root 1.40 log_to_syslog => "user",
56 root 1.23 );
57    
58 root 1.1 =head1 DESCRIPTION
59    
60 root 1.2 This module implements a relatively simple "logging framework". It doesn't
61     attempt to be "the" logging solution or even "a" logging solution for
62     AnyEvent - AnyEvent simply creates logging messages internally, and this
63     module more or less exposes the mechanism, with some extra spiff to allow
64     using it from other modules as well.
65    
66 root 1.20 Remember that the default verbosity level is C<0> (C<off>), so nothing
67     will be logged, unless you set C<PERL_ANYEVENT_VERBOSE> to a higher number
68     before starting your program, or change the logging level at runtime with
69 root 1.9 something like:
70 root 1.2
71 root 1.18 use AnyEvent::Log;
72 root 1.34 $AnyEvent::Log::FILTER->level ("info");
73 root 1.2
74 root 1.10 The design goal behind this module was to keep it simple (and small),
75     but make it powerful enough to be potentially useful for any module, and
76     extensive enough for the most common tasks, such as logging to multiple
77     targets, or being able to log into a database.
78    
79 root 1.36 The module is also usable before AnyEvent itself is initialised, in which
80     case some of the functionality might be reduced.
81    
82 root 1.33 The amount of documentation might indicate otherwise, but the runtime part
83     of the module is still just below 300 lines of code.
84 root 1.18
85     =head1 LOGGING LEVELS
86    
87     Logging levels in this module range from C<1> (highest priority) to C<9>
88     (lowest priority). Note that the lowest numerical value is the highest
89     priority, so when this document says "higher priority" it means "lower
90     numerical value".
91    
92     Instead of specifying levels by name you can also specify them by aliases:
93    
94     LVL NAME SYSLOG PERL NOTE
95 root 1.42 1 fatal emerg exit system unusable, aborts program!
96     2 alert failure in primary system
97     3 critical crit failure in backup system
98     4 error err die non-urgent program errors, a bug
99     5 warn warning possible problem, not necessarily error
100     6 note notice unusual conditions
101     7 info normal messages, no action required
102     8 debug debugging messages for development
103     9 trace copious tracing output
104 root 1.18
105     As you can see, some logging levels have multiple aliases - the first one
106     is the "official" name, the second one the "syslog" name (if it differs)
107 root 1.41 and the third one the "perl" name, suggesting (only!) that you log C<die>
108 root 1.42 messages at C<error> priority. The NOTE column tries to provide some
109     rationale on how to chose a logging level.
110    
111     As a rough guideline, levels 1..3 are primarily meant for users of
112     the program (admins, staff), and are the only logged to STDERR by
113     default. Levels 4..6 are meant for users and developers alike, while
114     levels 7..9 are usually meant for developers.
115 root 1.18
116     You can normally only log a single message at highest priority level
117     (C<1>, C<fatal>), because logging a fatal message will also quit the
118     program - so use it sparingly :)
119    
120     Some methods also offer some extra levels, such as C<0>, C<off>, C<none>
121     or C<all> - these are only valid in the methods they are documented for.
122 root 1.14
123 root 1.9 =head1 LOGGING FUNCTIONS
124 root 1.2
125     These functions allow you to log messages. They always use the caller's
126 root 1.18 package as a "logging context". Also, the main logging function C<log> is
127 root 1.7 callable as C<AnyEvent::log> or C<AE::log> when the C<AnyEvent> module is
128     loaded.
129 root 1.1
130     =over 4
131    
132     =cut
133    
134     package AnyEvent::Log;
135    
136 root 1.2 use Carp ();
137 root 1.1 use POSIX ();
138    
139     use AnyEvent (); BEGIN { AnyEvent::common_sense }
140 root 1.37 #use AnyEvent::Util (); need to load this in a delayed fashion, as it uses AE::log
141 root 1.1
142 root 1.14 our $VERSION = $AnyEvent::VERSION;
143    
144 root 1.18 our ($COLLECT, $FILTER, $LOG);
145    
146 root 1.2 our ($now_int, $now_str1, $now_str2);
147    
148     # Format Time, not public - yet?
149     sub ft($) {
150     my $i = int $_[0];
151     my $f = sprintf "%06d", 1e6 * ($_[0] - $i);
152    
153     ($now_int, $now_str1, $now_str2) = ($i, split /\x01/, POSIX::strftime "%Y-%m-%d %H:%M:%S.\x01 %z", localtime $i)
154     if $now_int != $i;
155    
156     "$now_str1$f$now_str2"
157     }
158    
159 root 1.18 our %CTX; # all package contexts
160 root 1.3
161 root 1.8 # creates a default package context object for the given package
162     sub _pkg_ctx($) {
163 root 1.10 my $ctx = bless [$_[0], (1 << 10) - 1 - 1, {}], "AnyEvent::Log::Ctx";
164 root 1.8
165     # link "parent" package
166 root 1.18 my $parent = $_[0] =~ /^(.+)::/
167     ? $CTX{$1} ||= &_pkg_ctx ("$1")
168     : $COLLECT;
169 root 1.8
170 root 1.18 $ctx->[2]{$parent+0} = $parent;
171 root 1.8
172     $ctx
173     }
174    
175 root 1.2 =item AnyEvent::Log::log $level, $msg[, @args]
176    
177 root 1.22 Requests logging of the given C<$msg> with the given log level, and
178     returns true if the message was logged I<somewhere>.
179 root 1.2
180 root 1.41 For loglevel C<fatal>, the program will abort.
181 root 1.2
182     If only a C<$msg> is given, it is logged as-is. With extra C<@args>, the
183     C<$msg> is interpreted as an sprintf format string.
184    
185     The C<$msg> should not end with C<\n>, but may if that is convenient for
186     you. Also, multiline messages are handled properly.
187    
188 root 1.3 Last not least, C<$msg> might be a code reference, in which case it is
189     supposed to return the message. It will be called only then the message
190     actually gets logged, which is useful if it is costly to create the
191     message in the first place.
192 root 1.2
193     Whether the given message will be logged depends on the maximum log level
194 root 1.22 and the caller's package. The return value can be used to ensure that
195     messages or not "lost" - for example, when L<AnyEvent::Debug> detects a
196     runtime error it tries to log it at C<die> level, but if that message is
197     lost it simply uses warn.
198 root 1.2
199     Note that you can (and should) call this function as C<AnyEvent::log> or
200 root 1.8 C<AE::log>, without C<use>-ing this module if possible (i.e. you don't
201     need any additional functionality), as those functions will load the
202     logging module on demand only. They are also much shorter to write.
203    
204 root 1.11 Also, if you optionally generate a lot of debug messages (such as when
205 root 1.8 tracing some code), you should look into using a logger callback and a
206     boolean enabler (see C<logger>, below).
207 root 1.2
208 root 1.3 Example: log something at error level.
209    
210     AE::log error => "something";
211    
212     Example: use printf-formatting.
213    
214     AE::log info => "%5d %-10.10s %s", $index, $category, $msg;
215    
216     Example: only generate a costly dump when the message is actually being logged.
217    
218     AE::log debug => sub { require Data::Dump; Data::Dump::dump \%cache };
219    
220 root 1.2 =cut
221    
222     # also allow syslog equivalent names
223     our %STR2LEVEL = (
224 root 1.18 fatal => 1, emerg => 1, exit => 1,
225 root 1.2 alert => 2,
226     critical => 3, crit => 3,
227 root 1.18 error => 4, err => 4, die => 4,
228 root 1.2 warn => 5, warning => 5,
229     note => 6, notice => 6,
230     info => 7,
231     debug => 8,
232     trace => 9,
233     );
234    
235 root 1.38 our $TIME_EXACT;
236    
237     sub exact_time($) {
238     $TIME_EXACT = shift;
239     *_ts = $AnyEvent::MODEL
240     ? $TIME_EXACT ? \&AE::now : \&AE::time
241     : sub () { $TIME_EXACT ? do { require Time::HiRes; Time::HiRes::time () } : time };
242     }
243    
244     BEGIN {
245     exact_time 0;
246     }
247 root 1.10
248 root 1.4 AnyEvent::post_detect {
249 root 1.38 exact_time $TIME_EXACT;
250 root 1.4 };
251    
252 root 1.2 our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace);
253    
254 root 1.8 # time, ctx, level, msg
255     sub _format($$$$) {
256 root 1.11 my $ts = ft $_[0];
257     my $ct = " ";
258    
259 root 1.10 my @res;
260 root 1.8
261 root 1.10 for (split /\n/, sprintf "%-5s %s: %s", $LEVEL2STR[$_[2]], $_[1][0], $_[3]) {
262 root 1.11 push @res, "$ts$ct$_\n";
263     $ct = " + ";
264 root 1.10 }
265    
266     join "", @res
267 root 1.8 }
268    
269 root 1.43 sub fatal_exit() {
270     exit 1;
271     }
272    
273 root 1.3 sub _log {
274 root 1.8 my ($ctx, $level, $format, @args) = @_;
275 root 1.2
276 root 1.11 $level = $level > 0 && $level <= 9
277     ? $level+0
278     : $STR2LEVEL{$level} || Carp::croak "$level: not a valid logging level, caught";
279 root 1.2
280 root 1.8 my $mask = 1 << $level;
281 root 1.2
282 root 1.22 my ($success, %seen, @ctx, $now, $fmt);
283 root 1.8
284 root 1.11 do
285     {
286     # skip if masked
287     if ($ctx->[1] & $mask && !$seen{$ctx+0}++) {
288     if ($ctx->[3]) {
289     # logging target found
290    
291     # now get raw message, unless we have it already
292     unless ($now) {
293     $format = $format->() if ref $format;
294     $format = sprintf $format, @args if @args;
295     $format =~ s/\n$//;
296 root 1.38 $now = _ts;
297 root 1.11 };
298    
299     # format msg
300     my $str = $ctx->[4]
301     ? $ctx->[4]($now, $_[0], $level, $format)
302 root 1.20 : ($fmt ||= _format $now, $_[0], $level, $format);
303 root 1.11
304 root 1.22 $success = 1;
305    
306 root 1.21 $ctx->[3]($str)
307 root 1.18 or push @ctx, values %{ $ctx->[2] }; # not consumed - propagate
308     } else {
309     push @ctx, values %{ $ctx->[2] }; # not masked - propagate
310 root 1.11 }
311     }
312 root 1.8 }
313 root 1.11 while $ctx = pop @ctx;
314 root 1.2
315 root 1.43 fatal_exit if $level <= 1;
316 root 1.22
317     $success
318 root 1.2 }
319    
320 root 1.3 sub log($$;@) {
321 root 1.8 _log
322     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
323     @_;
324 root 1.3 }
325    
326     =item $logger = AnyEvent::Log::logger $level[, \$enabled]
327    
328     Creates a code reference that, when called, acts as if the
329 root 1.22 C<AnyEvent::Log::log> function was called at this point with the given
330 root 1.3 level. C<$logger> is passed a C<$msg> and optional C<@args>, just as with
331     the C<AnyEvent::Log::log> function:
332    
333     my $debug_log = AnyEvent::Log::logger "debug";
334    
335     $debug_log->("debug here");
336     $debug_log->("%06d emails processed", 12345);
337     $debug_log->(sub { $obj->as_string });
338    
339     The idea behind this function is to decide whether to log before actually
340     logging - when the C<logger> function is called once, but the returned
341     logger callback often, then this can be a tremendous speed win.
342    
343     Despite this speed advantage, changes in logging configuration will
344     still be reflected by the logger callback, even if configuration changes
345     I<after> it was created.
346    
347     To further speed up logging, you can bind a scalar variable to the logger,
348     which contains true if the logger should be called or not - if it is
349     false, calling the logger can be safely skipped. This variable will be
350     updated as long as C<$logger> is alive.
351    
352     Full example:
353    
354     # near the init section
355     use AnyEvent::Log;
356    
357     my $debug_log = AnyEvent:Log::logger debug => \my $debug;
358    
359     # and later in your program
360     $debug_log->("yo, stuff here") if $debug;
361    
362     $debug and $debug_log->("123");
363    
364     =cut
365    
366     our %LOGGER;
367    
368     # re-assess logging status for all loggers
369     sub _reassess {
370 root 1.17 local $SIG{__DIE__};
371     my $die = sub { die };
372    
373 root 1.3 for (@_ ? $LOGGER{$_[0]} : values %LOGGER) {
374 root 1.8 my ($ctx, $level, $renabled) = @$_;
375 root 1.3
376 root 1.17 # to detect whether a message would be logged, we actually
377 root 1.11 # try to log one and die. this isn't fast, but we can be
378 root 1.3 # sure that the logging decision is correct :)
379    
380     $$renabled = !eval {
381 root 1.17 _log $ctx, $level, $die;
382 root 1.3
383     1
384     };
385     }
386     }
387    
388 root 1.15 sub _logger {
389 root 1.8 my ($ctx, $level, $renabled) = @_;
390 root 1.3
391     $$renabled = 1;
392    
393 root 1.8 my $logger = [$ctx, $level, $renabled];
394 root 1.3
395     $LOGGER{$logger+0} = $logger;
396    
397     _reassess $logger+0;
398    
399 root 1.43 require AnyEvent::Util unless $AnyEvent::Util::VERSION;
400 root 1.37 my $guard = AnyEvent::Util::guard (sub {
401 root 1.3 # "clean up"
402     delete $LOGGER{$logger+0};
403 root 1.37 });
404 root 1.3
405     sub {
406     $guard if 0; # keep guard alive, but don't cause runtime overhead
407    
408 root 1.8 _log $ctx, $level, @_
409 root 1.3 if $$renabled;
410     }
411     }
412    
413 root 1.8 sub logger($;$) {
414     _logger
415     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
416     @_
417     }
418    
419 root 1.38 =item AnyEvent::Log::exact_time $on
420    
421     By default, C<AnyEvent::Log> will use C<AE::now>, i.e. the cached
422     eventloop time, for the log timestamps. After calling this function with a
423     true value it will instead resort to C<AE::time>, i.e. fetch the current
424     time on each log message. This only makes a difference for event loops
425     that actually cache the time (such as L<EV> or L<AnyEvent::Loop>).
426    
427 root 1.39 This setting can be changed at any time by calling this function.
428    
429 root 1.38 Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been
430     initialised, this switch will also decide whether to use C<CORE::time> or
431     C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes
432     available.
433    
434 root 1.2 =back
435    
436 root 1.9 =head1 LOGGING CONTEXTS
437 root 1.2
438 root 1.9 This module associates every log message with a so-called I<logging
439     context>, based on the package of the caller. Every perl package has its
440     own logging context.
441 root 1.8
442 root 1.10 A logging context has three major responsibilities: filtering, logging and
443     propagating the message.
444 root 1.9
445 root 1.10 For the first purpose, filtering, each context has a set of logging
446     levels, called the log level mask. Messages not in the set will be ignored
447     by this context (masked).
448    
449     For logging, the context stores a formatting callback (which takes the
450     timestamp, context, level and string message and formats it in the way
451     it should be logged) and a logging callback (which is responsible for
452     actually logging the formatted message and telling C<AnyEvent::Log>
453     whether it has consumed the message, or whether it should be propagated).
454 root 1.9
455 root 1.18 For propagation, a context can have any number of attached I<slave
456 root 1.10 contexts>. Any message that is neither masked by the logging mask nor
457 root 1.18 masked by the logging callback returning true will be passed to all slave
458 root 1.10 contexts.
459 root 1.9
460 root 1.11 Each call to a logging function will log the message at most once per
461     context, so it does not matter (much) if there are cycles or if the
462     message can arrive at the same context via multiple paths.
463    
464 root 1.9 =head2 DEFAULTS
465    
466 root 1.10 By default, all logging contexts have an full set of log levels ("all"), a
467 root 1.9 disabled logging callback and the default formatting callback.
468    
469     Package contexts have the package name as logging title by default.
470    
471 root 1.18 They have exactly one slave - the context of the "parent" package. The
472 root 1.9 parent package is simply defined to be the package name without the last
473     component, i.e. C<AnyEvent::Debug::Wrapped> becomes C<AnyEvent::Debug>,
474 root 1.18 and C<AnyEvent> becomes ... C<$AnyEvent::Log::COLLECT> which is the
475     exception of the rule - just like the "parent" of any single-component
476     package name in Perl is C<main>, the default slave of any top-level
477     package context is C<$AnyEvent::Log::COLLECT>.
478 root 1.9
479 root 1.18 Since perl packages form only an approximate hierarchy, this slave
480 root 1.9 context can of course be removed.
481    
482 root 1.18 All other (anonymous) contexts have no slaves and an empty title by
483 root 1.9 default.
484    
485 root 1.18 When the module is loaded it creates the C<$AnyEvent::Log::LOG> logging
486     context that simply logs everything via C<warn>, without propagating
487     anything anywhere by default. The purpose of this context is to provide
488 root 1.12 a convenient place to override the global logging target or to attach
489     additional log targets. It's not meant for filtering.
490    
491 root 1.18 It then creates the C<$AnyEvent::Log::FILTER> context whose
492     purpose is to suppress all messages with priority higher
493     than C<$ENV{PERL_ANYEVENT_VERBOSE}>. It then attached the
494     C<$AnyEvent::Log::LOG> context to it. The purpose of the filter context
495     is to simply provide filtering according to some global log level.
496    
497     Finally it creates the top-level package context C<$AnyEvent::Log::COLLECT>
498     and attaches the C<$AnyEvent::Log::FILTER> context to it, but otherwise
499     leaves it at default config. Its purpose is simply to collect all log
500     messages system-wide.
501    
502     The hierarchy is then:
503    
504     any package, eventually -> $COLLECT -> $FILTER -> $LOG
505    
506     The effect of all this is that log messages, by default, wander up to the
507     C<$AnyEvent::Log::COLLECT> context where all messages normally end up,
508     from there to C<$AnyEvent::Log::FILTER> where log messages with lower
509     priority then C<$ENV{PERL_ANYEVENT_VERBOSE}> will be filtered out and then
510     to the C<$AnyEvent::Log::LOG> context to be passed to C<warn>.
511    
512     This makes it easy to set a global logging level (by modifying $FILTER),
513     but still allow other contexts to send, for example, their debug and trace
514     messages to the $LOG target despite the global logging level, or to attach
515     additional log targets that log messages, regardless of the global logging
516     level.
517    
518     It also makes it easy to modify the default warn-logger ($LOG) to
519     something that logs to a file, or to attach additional logging targets
520     (such as loggign to a file) by attaching it to $FILTER.
521 root 1.9
522 root 1.11 =head2 CREATING/FINDING/DESTROYING CONTEXTS
523 root 1.2
524     =over 4
525    
526 root 1.8 =item $ctx = AnyEvent::Log::ctx [$pkg]
527    
528 root 1.9 This function creates or returns a logging context (which is an object).
529 root 1.8
530 root 1.9 If a package name is given, then the context for that packlage is
531     returned. If it is called without any arguments, then the context for the
532     callers package is returned (i.e. the same context as a C<AE::log> call
533     would use).
534 root 1.8
535     If C<undef> is given, then it creates a new anonymous context that is not
536     tied to any package and is destroyed when no longer referenced.
537    
538     =cut
539    
540     sub ctx(;$) {
541     my $pkg = @_ ? shift : (caller)[0];
542    
543     ref $pkg
544     ? $pkg
545     : defined $pkg
546     ? $CTX{$pkg} ||= AnyEvent::Log::_pkg_ctx $pkg
547 root 1.10 : bless [undef, (1 << 10) - 1 - 1], "AnyEvent::Log::Ctx"
548 root 1.8 }
549    
550 root 1.11 =item AnyEvent::Log::reset
551    
552 root 1.16 Resets all package contexts and recreates the default hierarchy if
553     necessary, i.e. resets the logging subsystem to defaults, as much as
554     possible. This process keeps references to contexts held by other parts of
555     the program intact.
556 root 1.11
557     This can be used to implement config-file (re-)loading: before loading a
558     configuration, reset all contexts.
559    
560     =cut
561    
562 root 1.43 our $ORIG_VERBOSE = $AnyEvent::VERBOSE;
563     $AnyEvent::VERBOSE = 9;
564    
565 root 1.11 sub reset {
566 root 1.15 # hard to kill complex data structures
567 root 1.19 # we "recreate" all package loggers and reset the hierarchy
568 root 1.15 while (my ($k, $v) = each %CTX) {
569     @$v = ($k, (1 << 10) - 1 - 1, { });
570    
571 root 1.19 $v->attach ($k =~ /^(.+)::/ ? $CTX{$1} : $AnyEvent::Log::COLLECT);
572 root 1.15 }
573 root 1.11
574 root 1.19 @$_ = ($_->[0], (1 << 10) - 1 - 1)
575     for $LOG, $FILTER, $COLLECT;
576    
577 root 1.35 #$LOG->slaves;
578 root 1.18 $LOG->title ('$AnyEvent::Log::LOG');
579 root 1.27 $LOG->log_to_warn;
580 root 1.15
581 root 1.18 $FILTER->slaves ($LOG);
582     $FILTER->title ('$AnyEvent::Log::FILTER');
583 root 1.43 $FILTER->level ($ORIG_VERBOSE);
584 root 1.18
585     $COLLECT->slaves ($FILTER);
586 root 1.19 $COLLECT->title ('$AnyEvent::Log::COLLECT');
587 root 1.15
588     _reassess;
589 root 1.11 }
590    
591 root 1.43 # override AE::log/logger
592     *AnyEvent::log = *AE::log = \&log;
593     *AnyEvent::logger = *AE::logger = \&logger;
594    
595     # convert AnyEvent loggers to AnyEvent::Log loggers
596     $_->[0] = ctx $_->[0] # convert "pkg" to "ctx"
597     for values %LOGGER;
598    
599 root 1.15 # create the default logger contexts
600 root 1.18 $LOG = ctx undef;
601     $FILTER = ctx undef;
602     $COLLECT = ctx undef;
603 root 1.15
604 root 1.11 AnyEvent::Log::reset;
605    
606 root 1.12 # hello, CPAN, please catch me
607 root 1.18 package AnyEvent::Log::LOG;
608     package AE::Log::LOG;
609     package AnyEvent::Log::FILTER;
610     package AE::Log::FILTER;
611     package AnyEvent::Log::COLLECT;
612     package AE::Log::COLLECT;
613 root 1.8
614 root 1.12 package AnyEvent::Log::Ctx;
615    
616 root 1.18 # 0 1 2 3 4
617     # [$title, $level, %$slaves, &$logcb, &$fmtcb]
618 root 1.12
619     =item $ctx = new AnyEvent::Log::Ctx methodname => param...
620    
621     This is a convenience constructor that makes it simpler to construct
622     anonymous logging contexts.
623    
624     Each key-value pair results in an invocation of the method of the same
625     name as the key with the value as parameter, unless the value is an
626     arrayref, in which case it calls the method with the contents of the
627     array. The methods are called in the same order as specified.
628    
629     Example: create a new logging context and set both the default logging
630 root 1.18 level, some slave contexts and a logging callback.
631 root 1.12
632     $ctx = new AnyEvent::Log::Ctx
633     title => "dubious messages",
634     level => "error",
635     log_cb => sub { print STDOUT shift; 0 },
636 root 1.18 slaves => [$ctx1, $ctx, $ctx2],
637 root 1.12 ;
638    
639 root 1.9 =back
640    
641     =cut
642    
643 root 1.12 sub new {
644     my $class = shift;
645    
646     my $ctx = AnyEvent::Log::ctx undef;
647    
648     while (@_) {
649     my ($k, $v) = splice @_, 0, 2;
650     $ctx->$k (ref $v eq "ARRAY" ? @$v : $v);
651     }
652    
653     bless $ctx, $class # do we really support subclassing, hmm?
654     }
655 root 1.8
656    
657 root 1.9 =head2 CONFIGURING A LOG CONTEXT
658    
659     The following methods can be used to configure the logging context.
660    
661     =over 4
662    
663 root 1.8 =item $ctx->title ([$new_title])
664    
665     Returns the title of the logging context - this is the package name, for
666     package contexts, and a user defined string for all others.
667    
668     If C<$new_title> is given, then it replaces the package name or title.
669    
670     =cut
671    
672     sub title {
673     $_[0][0] = $_[1] if @_ > 1;
674     $_[0][0]
675     }
676    
677 root 1.9 =back
678    
679     =head3 LOGGING LEVELS
680    
681 root 1.10 The following methods deal with the logging level set associated with the
682     log context.
683 root 1.9
684     The most common method to use is probably C<< $ctx->level ($level) >>,
685     which configures the specified and any higher priority levels.
686    
687 root 1.10 All functions which accept a list of levels also accept the special string
688     C<all> which expands to all logging levels.
689    
690 root 1.9 =over 4
691    
692 root 1.8 =item $ctx->levels ($level[, $level...)
693    
694 root 1.10 Enables logging for the given levels and disables it for all others.
695 root 1.8
696     =item $ctx->level ($level)
697    
698     Enables logging for the given level and all lower level (higher priority)
699 root 1.10 ones. In addition to normal logging levels, specifying a level of C<0> or
700     C<off> disables all logging for this level.
701 root 1.8
702     Example: log warnings, errors and higher priority messages.
703    
704     $ctx->level ("warn");
705     $ctx->level (5); # same thing, just numeric
706    
707     =item $ctx->enable ($level[, $level...])
708    
709     Enables logging for the given levels, leaving all others unchanged.
710 root 1.5
711 root 1.8 =item $ctx->disable ($level[, $level...])
712    
713     Disables logging for the given levels, leaving all others unchanged.
714    
715     =cut
716    
717     sub _lvl_lst {
718 root 1.10 map {
719     $_ > 0 && $_ <= 9 ? $_+0
720     : $_ eq "all" ? (1 .. 9)
721     : $STR2LEVEL{$_} || Carp::croak "$_: not a valid logging level, caught"
722     } @_
723 root 1.8 }
724    
725     our $NOP_CB = sub { 0 };
726    
727     sub levels {
728     my $ctx = shift;
729     $ctx->[1] = 0;
730     $ctx->[1] |= 1 << $_
731     for &_lvl_lst;
732     AnyEvent::Log::_reassess;
733     }
734    
735     sub level {
736     my $ctx = shift;
737 root 1.10 my $lvl = $_[0] =~ /^(?:0|off|none)$/ ? 0 : (_lvl_lst $_[0])[-1];
738    
739 root 1.8 $ctx->[1] = ((1 << $lvl) - 1) << 1;
740     AnyEvent::Log::_reassess;
741     }
742    
743     sub enable {
744     my $ctx = shift;
745     $ctx->[1] |= 1 << $_
746     for &_lvl_lst;
747     AnyEvent::Log::_reassess;
748     }
749    
750     sub disable {
751     my $ctx = shift;
752     $ctx->[1] &= ~(1 << $_)
753     for &_lvl_lst;
754     AnyEvent::Log::_reassess;
755     }
756    
757 root 1.9 =back
758    
759 root 1.18 =head3 SLAVE CONTEXTS
760 root 1.9
761     The following methods attach and detach another logging context to a
762     logging context.
763    
764 root 1.18 Log messages are propagated to all slave contexts, unless the logging
765 root 1.9 callback consumes the message.
766    
767     =over 4
768    
769 root 1.8 =item $ctx->attach ($ctx2[, $ctx3...])
770    
771 root 1.18 Attaches the given contexts as slaves to this context. It is not an error
772 root 1.8 to add a context twice (the second add will be ignored).
773    
774     A context can be specified either as package name or as a context object.
775    
776     =item $ctx->detach ($ctx2[, $ctx3...])
777    
778 root 1.18 Removes the given slaves from this context - it's not an error to attempt
779 root 1.8 to remove a context that hasn't been added.
780    
781     A context can be specified either as package name or as a context object.
782 root 1.5
783 root 1.18 =item $ctx->slaves ($ctx2[, $ctx3...])
784 root 1.11
785 root 1.18 Replaces all slaves attached to this context by the ones given.
786 root 1.11
787 root 1.2 =cut
788    
789 root 1.8 sub attach {
790     my $ctx = shift;
791    
792     $ctx->[2]{$_+0} = $_
793     for map { AnyEvent::Log::ctx $_ } @_;
794     }
795    
796     sub detach {
797     my $ctx = shift;
798    
799     delete $ctx->[2]{$_+0}
800     for map { AnyEvent::Log::ctx $_ } @_;
801     }
802    
803 root 1.18 sub slaves {
804 root 1.11 undef $_[0][2];
805     &attach;
806     }
807    
808 root 1.9 =back
809    
810 root 1.18 =head3 LOG TARGETS
811 root 1.9
812     The following methods configure how the logging context actually does
813 root 1.10 the logging (which consists of formatting the message and printing it or
814 root 1.18 whatever it wants to do with it).
815 root 1.9
816     =over 4
817    
818 root 1.21 =item $ctx->log_cb ($cb->($str)
819 root 1.5
820 root 1.8 Replaces the logging callback on the context (C<undef> disables the
821     logging callback).
822 root 1.5
823 root 1.8 The logging callback is responsible for handling formatted log messages
824     (see C<fmt_cb> below) - normally simple text strings that end with a
825 root 1.21 newline (and are possibly multiline themselves).
826 root 1.8
827     It also has to return true iff it has consumed the log message, and false
828     if it hasn't. Consuming a message means that it will not be sent to any
829 root 1.18 slave context. When in doubt, return C<0> from your logging callback.
830 root 1.8
831     Example: a very simple logging callback, simply dump the message to STDOUT
832     and do not consume it.
833    
834     $ctx->log_cb (sub { print STDERR shift; 0 });
835    
836 root 1.10 You can filter messages by having a log callback that simply returns C<1>
837     and does not do anything with the message, but this counts as "message
838     being logged" and might not be very efficient.
839    
840     Example: propagate all messages except for log levels "debug" and
841     "trace". The messages will still be generated, though, which can slow down
842     your program.
843    
844     $ctx->levels ("debug", "trace");
845     $ctx->log_cb (sub { 1 }); # do not log, but eat debug and trace messages
846    
847 root 1.20 =item $ctx->fmt_cb ($fmt_cb->($timestamp, $orig_ctx, $level, $message))
848 root 1.8
849 root 1.10 Replaces the formatting callback on the context (C<undef> restores the
850 root 1.8 default formatter).
851    
852     The callback is passed the (possibly fractional) timestamp, the original
853 root 1.18 logging context, the (numeric) logging level and the raw message string
854     and needs to return a formatted log message. In most cases this will be a
855     string, but it could just as well be an array reference that just stores
856     the values.
857    
858 root 1.26 If, for some reason, you want to use C<caller> to find out more baout the
859 root 1.18 logger then you should walk up the call stack until you are no longer
860     inside the C<AnyEvent::Log> package.
861 root 1.8
862     Example: format just the raw message, with numeric log level in angle
863     brackets.
864    
865     $ctx->fmt_cb (sub {
866     my ($time, $ctx, $lvl, $msg) = @_;
867    
868     "<$lvl>$msg\n"
869     });
870    
871     Example: return an array reference with just the log values, and use
872     C<PApp::SQL::sql_exec> to store the emssage in a database.
873    
874     $ctx->fmt_cb (sub { \@_ });
875     $ctx->log_cb (sub {
876     my ($msg) = @_;
877    
878     sql_exec "insert into log (when, subsys, prio, msg) values (?, ?, ?, ?)",
879     $msg->[0] + 0,
880     "$msg->[1]",
881     $msg->[2] + 0,
882     "$msg->[3]";
883    
884     0
885     });
886    
887 root 1.27 =item $ctx->log_to_warn
888    
889     Sets the C<log_cb> to simply use C<CORE::warn> to report any messages
890     (usually this logs to STDERR).
891    
892 root 1.21 =item $ctx->log_to_file ($path)
893    
894     Sets the C<log_cb> to log to a file (by appending), unbuffered.
895    
896     =item $ctx->log_to_path ($path)
897    
898     Same as C<< ->log_to_file >>, but opens the file for each message. This
899     is much slower, but allows you to change/move/rename/delete the file at
900     basically any time.
901    
902 root 1.27 Needless(?) to say, if you do not want to be bitten by some evil person
903     calling C<chdir>, the path should be absolute. Doesn't help with
904     C<chroot>, but hey...
905    
906 root 1.40 =item $ctx->log_to_syslog ([$facility])
907 root 1.21
908 root 1.40 Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and
909     all the others in the obvious way. If specified, then the C<$facility> is
910     used as the facility (C<user>, C<auth>, C<local0> and so on). The default
911     facility is C<user>.
912 root 1.21
913     Note that this function also sets a C<fmt_cb> - the logging part requires
914     an array reference with [$level, $str] as input.
915    
916 root 1.8 =cut
917    
918     sub log_cb {
919     my ($ctx, $cb) = @_;
920 root 1.6
921 root 1.10 $ctx->[3] = $cb;
922 root 1.6 }
923 root 1.5
924 root 1.8 sub fmt_cb {
925     my ($ctx, $cb) = @_;
926 root 1.6
927 root 1.8 $ctx->[4] = $cb;
928 root 1.5 }
929    
930 root 1.27 sub log_to_warn {
931     my ($ctx, $path) = @_;
932    
933     $ctx->log_cb (sub {
934     warn shift;
935     0
936     });
937     }
938    
939 root 1.18 sub log_to_file {
940     my ($ctx, $path) = @_;
941    
942     open my $fh, ">>", $path
943     or die "$path: $!";
944    
945     $ctx->log_cb (sub {
946     syswrite $fh, shift;
947     0
948     });
949     }
950    
951 root 1.27 sub log_to_path {
952 root 1.18 my ($ctx, $path) = @_;
953    
954     $ctx->log_cb (sub {
955     open my $fh, ">>", $path
956     or die "$path: $!";
957    
958     syswrite $fh, shift;
959     0
960     });
961     }
962    
963 root 1.20 sub log_to_syslog {
964 root 1.40 my ($ctx, $facility) = @_;
965 root 1.20
966     require Sys::Syslog;
967    
968 root 1.21 $ctx->fmt_cb (sub {
969     my $str = $_[3];
970     $str =~ s/\n(?=.)/\n+ /g;
971    
972     [$_[2], "($_[1][0]) $str"]
973     });
974    
975 root 1.40 $facility ||= "user";
976    
977 root 1.20 $ctx->log_cb (sub {
978 root 1.21 my $lvl = $_[0][0] < 9 ? $_[0][0] : 8;
979 root 1.20
980 root 1.40 Sys::Syslog::syslog ("$facility|" . ($lvl - 1), $_)
981 root 1.21 for split /\n/, $_[0][1];
982 root 1.20
983     0
984     });
985     }
986    
987 root 1.18 =back
988    
989     =head3 MESSAGE LOGGING
990    
991     These methods allow you to log messages directly to a context, without
992     going via your package context.
993    
994     =over 4
995    
996 root 1.8 =item $ctx->log ($level, $msg[, @params])
997    
998     Same as C<AnyEvent::Log::log>, but uses the given context as log context.
999    
1000     =item $logger = $ctx->logger ($level[, \$enabled])
1001    
1002     Same as C<AnyEvent::Log::logger>, but uses the given context as log
1003     context.
1004    
1005     =cut
1006    
1007     *log = \&AnyEvent::Log::_log;
1008     *logger = \&AnyEvent::Log::_logger;
1009    
1010 root 1.27 =back
1011    
1012     =cut
1013    
1014     package AnyEvent::Log;
1015    
1016     =head1 CONFIGURATION VIA $ENV{PERL_ANYEVENT_LOG}
1017    
1018     Logging can also be configured by setting the environment variable
1019     C<PERL_ANYEVENT_LOG> (or C<AE_LOG>).
1020    
1021     The value consists of one or more logging context specifications separated
1022     by C<:> or whitespace. Each logging specification in turn starts with a
1023     context name, followed by C<=>, followed by zero or more comma-separated
1024     configuration directives, here are some examples:
1025    
1026     # set default logging level
1027     filter=warn
1028    
1029     # log to file instead of to stderr
1030     log=file=/tmp/mylog
1031    
1032     # log to file in addition to stderr
1033     log=+%file:%file=file=/tmp/mylog
1034    
1035     # enable debug log messages, log warnings and above to syslog
1036     filter=debug:log=+%warnings:%warnings=warn,syslog=LOG_LOCAL0
1037    
1038     # log trace messages (only) from AnyEvent::Debug to file
1039     AnyEvent::Debug=+%trace:%trace=only,trace,file=/tmp/tracelog
1040    
1041     A context name in the log specification can be any of the following:
1042    
1043     =over 4
1044    
1045     =item C<collect>, C<filter>, C<log>
1046    
1047     Correspond to the three predefined C<$AnyEvent::Log::COLLECT>,
1048     C<AnyEvent::Log::FILTER> and C<$AnyEvent::Log::LOG> contexts.
1049    
1050     =item C<%name>
1051    
1052     Context names starting with a C<%> are anonymous contexts created when the
1053     name is first mentioned. The difference to package contexts is that by
1054     default they have no attached slaves.
1055    
1056     =item a perl package name
1057    
1058     Any other string references the logging context associated with the given
1059     Perl C<package>. In the unlikely case where you want to specify a package
1060     context that matches on of the other context name forms, you can add a
1061     C<::> to the package name to force interpretation as a package.
1062    
1063     =back
1064    
1065     The configuration specifications can be any number of the following:
1066    
1067     =over 4
1068    
1069     =item C<stderr>
1070    
1071     Configures the context to use Perl's C<warn> function (which typically
1072     logs to C<STDERR>). Works like C<log_to_warn>.
1073    
1074     =item C<file=>I<path>
1075    
1076     Configures the context to log to a file with the given path. Works like
1077     C<log_to_file>.
1078    
1079     =item C<path=>I<path>
1080    
1081     Configures the context to log to a file with the given path. Works like
1082     C<log_to_path>.
1083    
1084     =item C<syslog> or C<syslog=>I<expr>
1085    
1086 root 1.32 Configures the context to log to syslog. If I<expr> is given, then it is
1087 root 1.27 evaluated in the L<Sys::Syslog> package, so you could use:
1088    
1089     log=syslog=LOG_LOCAL0
1090    
1091     =item C<nolog>
1092    
1093     Configures the context to not log anything by itself, which is the
1094     default. Same as C<< $ctx->log_cb (undef) >>.
1095    
1096     =item C<0> or C<off>
1097    
1098     Sets the logging level of the context ot C<0>, i.e. all messages will be
1099     filtered out.
1100    
1101     =item C<all>
1102    
1103     Enables all logging levels, i.e. filtering will effectively be switched
1104     off (the default).
1105    
1106     =item C<only>
1107    
1108     Disables all logging levels, and changes the interpretation of following
1109     level specifications to enable the specified level only.
1110    
1111     Example: only enable debug messages for a context.
1112    
1113     context=only,debug
1114    
1115     =item C<except>
1116    
1117     Enables all logging levels, and changes the interpretation of following
1118     level specifications to disable that level. Rarely used.
1119    
1120     Example: enable all logging levels except fatal and trace (this is rather
1121     nonsensical).
1122    
1123     filter=exept,fatal,trace
1124    
1125     =item C<level>
1126    
1127     Enables all logging levels, and changes the interpretation of following
1128     level specifications to be "that level or any higher priority
1129     message". This is the default.
1130    
1131     Example: log anything at or above warn level.
1132    
1133     filter=warn
1134    
1135     # or, more verbose
1136     filter=only,level,warn
1137    
1138 root 1.32 =item C<1>..C<9> or a logging level name (C<error>, C<debug> etc.)
1139 root 1.27
1140     A numeric loglevel or the name of a loglevel will be interpreted according
1141     to the most recent C<only>, C<except> or C<level> directive. By default,
1142     specifying a logging level enables that and any higher priority messages.
1143    
1144     =item C<+>I<context>
1145    
1146 root 1.32 Attaches the named context as slave to the context.
1147 root 1.27
1148     =item C<+>
1149    
1150 root 1.32 A line C<+> detaches all contexts, i.e. clears the slave list from the
1151     context. Anonymous (C<%name>) contexts have no attached slaves by default,
1152     but package contexts have the parent context as slave by default.
1153 root 1.27
1154     Example: log messages from My::Module to a file, do not send them to the
1155     default log collector.
1156    
1157     My::Module=+,file=/tmp/mymodulelog
1158 root 1.1
1159     =back
1160    
1161 root 1.30 Any character can be escaped by prefixing it with a C<\> (backslash), as
1162 root 1.33 usual, so to log to a file containing a comma, colon, backslash and some
1163     spaces in the filename, you would do this:
1164 root 1.30
1165     PERL_ANYEVENT_LOG='log=file=/some\ \:file\ with\,\ \\-escapes'
1166    
1167     Since whitespace (which includes newlines) is allowed, it is fine to
1168     specify multiple lines in C<PERL_ANYEVENT_LOG>, e.g.:
1169    
1170     PERL_ANYEVENT_LOG="
1171     filter=warn
1172     AnyEvent::Debug=+%trace
1173     %trace=only,trace,+log
1174     " myprog
1175    
1176     Also, in the unlikely case when you want to concatenate specifications,
1177     use whitespace as separator, as C<::> will be interpreted as part of a
1178     module name, an empty spec with two separators:
1179    
1180     PERL_ANYEVENT_LOG="$PERL_ANYEVENT_LOG MyMod=debug"
1181    
1182 root 1.27 =cut
1183    
1184     for (my $spec = $ENV{PERL_ANYEVENT_LOG}) {
1185     my %anon;
1186    
1187     my $pkg = sub {
1188 root 1.29 $_[0] eq "log" ? $LOG
1189     : $_[0] eq "filter" ? $FILTER
1190     : $_[0] eq "collect" ? $COLLECT
1191     : $_[0] =~ /^%(.+)$/ ? ($anon{$1} ||= ctx undef)
1192     : $_[0] =~ /^(.*?)(?:::)?$/ ? ctx "$1" # egad :/
1193     : die # never reached?
1194 root 1.27 };
1195    
1196 root 1.29 /\G[[:space:]]+/gc; # skip initial whitespace
1197    
1198     while (/\G((?:[^:=[:space:]]+|::|\\.)+)=/gc) {
1199 root 1.27 my $ctx = $pkg->($1);
1200     my $level = "level";
1201    
1202     while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) {
1203     for ("$1") {
1204     if ($_ eq "stderr" ) { $ctx->log_to_warn;
1205     } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1");
1206     } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1");
1207 root 1.40 } elsif (/syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog ($1);
1208 root 1.27 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef);
1209     } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1"));
1210     } elsif ($_ eq "+" ) { $ctx->slaves;
1211     } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0);
1212     } elsif ($_ eq "all" ) { $ctx->level ("all");
1213     } elsif ($_ eq "level" ) { $ctx->level ("all"); $level = "level";
1214     } elsif ($_ eq "only" ) { $ctx->level ("off"); $level = "enable";
1215     } elsif ($_ eq "except" ) { $ctx->level ("all"); $level = "disable";
1216     } elsif (/^\d$/ ) { $ctx->$level ($_);
1217     } elsif (exists $STR2LEVEL{$_} ) { $ctx->$level ($_);
1218     } else { die "PERL_ANYEVENT_LOG ($spec): parse error at '$_'\n";
1219     }
1220     }
1221    
1222     /\G,/gc or last;
1223     }
1224    
1225 root 1.29 /\G[:[:space:]]+/gc or last;
1226 root 1.27 }
1227    
1228 root 1.29 /\G[[:space:]]+/gc; # skip trailing whitespace
1229    
1230 root 1.27 if (/\G(.+)/g) {
1231     die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n";
1232     }
1233     }
1234    
1235     1;
1236    
1237 root 1.12 =head1 EXAMPLES
1238    
1239 root 1.28 This section shows some common configurations, both as code, and as
1240     C<PERL_ANYEVENT_LOG> string.
1241 root 1.12
1242     =over 4
1243    
1244     =item Setting the global logging level.
1245    
1246 root 1.28 Either put C<PERL_ANYEVENT_VERBOSE=><number> into your environment before
1247     running your program, use C<PERL_ANYEVENT_LOG> or modify the log level of
1248     the root context at runtime:
1249 root 1.12
1250     PERL_ANYEVENT_VERBOSE=5 ./myprog
1251    
1252 root 1.28 PERL_ANYEVENT_LOG=log=warn
1253    
1254 root 1.18 $AnyEvent::Log::FILTER->level ("warn");
1255 root 1.12
1256     =item Append all messages to a file instead of sending them to STDERR.
1257    
1258     This is affected by the global logging level.
1259    
1260 root 1.28 $AnyEvent::Log::LOG->log_to_file ($path);
1261    
1262     PERL_ANYEVENT_LOG=log=file=/some/path
1263 root 1.12
1264     =item Write all messages with priority C<error> and higher to a file.
1265    
1266     This writes them only when the global logging level allows it, because
1267     it is attached to the default context which is invoked I<after> global
1268     filtering.
1269    
1270 root 1.43 $AnyEvent::Log::FILTER->attach (
1271 root 1.18 new AnyEvent::Log::Ctx log_to_file => $path);
1272 root 1.12
1273 root 1.28 PERL_ANYEVENT_LOG=filter=+%filelogger:%filelogger=file=/some/path
1274    
1275 root 1.12 This writes them regardless of the global logging level, because it is
1276     attached to the toplevel context, which receives all messages I<before>
1277     the global filtering.
1278    
1279 root 1.18 $AnyEvent::Log::COLLECT->attach (
1280     new AnyEvent::Log::Ctx log_to_file => $path);
1281 root 1.12
1282 root 1.28 PERL_ANYEVENT_LOG=%filelogger=file=/some/path:collect=+%filelogger
1283    
1284 root 1.18 In both cases, messages are still written to STDERR.
1285 root 1.12
1286     =item Write trace messages (only) from L<AnyEvent::Debug> to the default logging target(s).
1287    
1288 root 1.18 Attach the C<$AnyEvent::Log::LOG> context to the C<AnyEvent::Debug>
1289     context - this simply circumvents the global filtering for trace messages.
1290 root 1.12
1291     my $debug = AnyEvent::Debug->AnyEvent::Log::ctx;
1292 root 1.18 $debug->attach ($AnyEvent::Log::LOG);
1293 root 1.12
1294 root 1.28 PERL_ANYEVENT_LOG=AnyEvent::Debug=+log
1295    
1296 root 1.18 This of course works for any package, not just L<AnyEvent::Debug>, but
1297     assumes the log level for AnyEvent::Debug hasn't been changed from the
1298     default.
1299 root 1.13
1300 root 1.12 =back
1301    
1302 root 1.1 =head1 AUTHOR
1303    
1304     Marc Lehmann <schmorp@schmorp.de>
1305     http://home.schmorp.de/
1306    
1307     =cut
1308 root 1.28