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