ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Log.pm
Revision: 1.38
Committed: Fri Aug 26 00:32:45 2011 UTC (12 years, 9 months ago) by root
Branch: MAIN
Changes since 1.37: +27 -3 lines
Log Message:
*** empty log message ***

File Contents

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