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