ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Log.pm
Revision: 1.16
Committed: Sat Aug 20 02:19:18 2011 UTC (12 years, 10 months ago) by root
Branch: MAIN
Changes since 1.15: +7 -19 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.8 # simple use
8     use AnyEvent;
9    
10     AE::log debug => "hit my knee";
11     AE::log warn => "it's a bit too hot";
12     AE::log error => "the flag was false!";
13     AE::log fatal => "the bit toggled! run!";
14    
15 root 1.10 # "complex" use
16 root 1.1 use AnyEvent::Log;
17    
18 root 1.8 my $tracer = AnyEvent::Log::logger trace => \$my $trace;
19    
20     $tracer->("i am here") if $trace;
21     $tracer->(sub { "lots of data: " . Dumper $self }) if $trace;
22    
23 root 1.10 # configuration
24    
25 root 1.16 # set logging for this package to errors and higher only
26     AnyEvent::Log::ctx->level ("error");
27 root 1.10
28     # set logging globally to anything below debug
29 root 1.16 $AnyEvent::Log::Root->level ("notice");
30 root 1.10
31     # see also EXAMPLES, below
32    
33 root 1.1 =head1 DESCRIPTION
34    
35 root 1.2 This module implements a relatively simple "logging framework". It doesn't
36     attempt to be "the" logging solution or even "a" logging solution for
37     AnyEvent - AnyEvent simply creates logging messages internally, and this
38     module more or less exposes the mechanism, with some extra spiff to allow
39     using it from other modules as well.
40    
41 root 1.5 Remember that the default verbosity level is C<0>, so nothing will be
42 root 1.11 logged, unless you set C<PERL_ANYEVENT_VERBOSE> to a higher number before
43     starting your program, or change the logging level at runtime with
44 root 1.9 something like:
45 root 1.2
46 root 1.9 use AnyEvent;
47     (AnyEvent::Log::ctx "")->level ("info");
48 root 1.2
49 root 1.10 The design goal behind this module was to keep it simple (and small),
50     but make it powerful enough to be potentially useful for any module, and
51     extensive enough for the most common tasks, such as logging to multiple
52     targets, or being able to log into a database.
53    
54 root 1.14 The amount of documentation might indicate otherwise, but the module is
55     still just 240 lines or so.
56    
57 root 1.9 =head1 LOGGING FUNCTIONS
58 root 1.2
59     These functions allow you to log messages. They always use the caller's
60 root 1.7 package as a "logging module/source". Also, the main logging function is
61     callable as C<AnyEvent::log> or C<AE::log> when the C<AnyEvent> module is
62     loaded.
63 root 1.1
64     =over 4
65    
66     =cut
67    
68     package AnyEvent::Log;
69    
70 root 1.2 use Carp ();
71 root 1.1 use POSIX ();
72    
73     use AnyEvent (); BEGIN { AnyEvent::common_sense }
74 root 1.3 use AnyEvent::Util ();
75 root 1.1
76 root 1.14 our $VERSION = $AnyEvent::VERSION;
77    
78 root 1.2 our ($now_int, $now_str1, $now_str2);
79    
80     # Format Time, not public - yet?
81     sub ft($) {
82     my $i = int $_[0];
83     my $f = sprintf "%06d", 1e6 * ($_[0] - $i);
84    
85     ($now_int, $now_str1, $now_str2) = ($i, split /\x01/, POSIX::strftime "%Y-%m-%d %H:%M:%S.\x01 %z", localtime $i)
86     if $now_int != $i;
87    
88     "$now_str1$f$now_str2"
89     }
90    
91 root 1.5 our %CTX; # all logging contexts
92 root 1.3
93 root 1.8 # creates a default package context object for the given package
94     sub _pkg_ctx($) {
95 root 1.10 my $ctx = bless [$_[0], (1 << 10) - 1 - 1, {}], "AnyEvent::Log::Ctx";
96 root 1.8
97     # link "parent" package
98 root 1.11 my $pkg = $_[0] =~ /^(.+)::/ ? $1 : "AE::Log::Top";
99 root 1.8
100     $pkg = $CTX{$pkg} ||= &_pkg_ctx ($pkg);
101     $ctx->[2]{$pkg+0} = $pkg;
102    
103     $ctx
104     }
105    
106 root 1.2 =item AnyEvent::Log::log $level, $msg[, @args]
107    
108     Requests logging of the given C<$msg> with the given log level (1..9).
109     You can also use the following strings as log level: C<fatal> (1),
110     C<alert> (2), C<critical> (3), C<error> (4), C<warn> (5), C<note> (6),
111     C<info> (7), C<debug> (8), C<trace> (9).
112    
113     For C<fatal> log levels, the program will abort.
114    
115     If only a C<$msg> is given, it is logged as-is. With extra C<@args>, the
116     C<$msg> is interpreted as an sprintf format string.
117    
118     The C<$msg> should not end with C<\n>, but may if that is convenient for
119     you. Also, multiline messages are handled properly.
120    
121 root 1.3 Last not least, C<$msg> might be a code reference, in which case it is
122     supposed to return the message. It will be called only then the message
123     actually gets logged, which is useful if it is costly to create the
124     message in the first place.
125 root 1.2
126     Whether the given message will be logged depends on the maximum log level
127     and the caller's package.
128    
129     Note that you can (and should) call this function as C<AnyEvent::log> or
130 root 1.8 C<AE::log>, without C<use>-ing this module if possible (i.e. you don't
131     need any additional functionality), as those functions will load the
132     logging module on demand only. They are also much shorter to write.
133    
134 root 1.11 Also, if you optionally generate a lot of debug messages (such as when
135 root 1.8 tracing some code), you should look into using a logger callback and a
136     boolean enabler (see C<logger>, below).
137 root 1.2
138 root 1.3 Example: log something at error level.
139    
140     AE::log error => "something";
141    
142     Example: use printf-formatting.
143    
144     AE::log info => "%5d %-10.10s %s", $index, $category, $msg;
145    
146     Example: only generate a costly dump when the message is actually being logged.
147    
148     AE::log debug => sub { require Data::Dump; Data::Dump::dump \%cache };
149    
150 root 1.2 =cut
151    
152     # also allow syslog equivalent names
153     our %STR2LEVEL = (
154     fatal => 1, emerg => 1,
155     alert => 2,
156     critical => 3, crit => 3,
157     error => 4, err => 4,
158     warn => 5, warning => 5,
159     note => 6, notice => 6,
160     info => 7,
161     debug => 8,
162     trace => 9,
163     );
164    
165 root 1.4 sub now () { time }
166 root 1.10
167 root 1.4 AnyEvent::post_detect {
168     *now = \&AE::now;
169     };
170    
171 root 1.2 our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace);
172    
173 root 1.8 # time, ctx, level, msg
174     sub _format($$$$) {
175 root 1.11 my $ts = ft $_[0];
176     my $ct = " ";
177    
178 root 1.10 my @res;
179 root 1.8
180 root 1.10 for (split /\n/, sprintf "%-5s %s: %s", $LEVEL2STR[$_[2]], $_[1][0], $_[3]) {
181 root 1.11 push @res, "$ts$ct$_\n";
182     $ct = " + ";
183 root 1.10 }
184    
185     join "", @res
186 root 1.8 }
187    
188 root 1.3 sub _log {
189 root 1.8 my ($ctx, $level, $format, @args) = @_;
190 root 1.2
191 root 1.11 $level = $level > 0 && $level <= 9
192     ? $level+0
193     : $STR2LEVEL{$level} || Carp::croak "$level: not a valid logging level, caught";
194 root 1.2
195 root 1.8 my $mask = 1 << $level;
196 root 1.2
197 root 1.11 my (%seen, @ctx, $now, $fmt);
198 root 1.8
199 root 1.11 do
200     {
201     # skip if masked
202     if ($ctx->[1] & $mask && !$seen{$ctx+0}++) {
203     if ($ctx->[3]) {
204     # logging target found
205    
206     # now get raw message, unless we have it already
207     unless ($now) {
208     $format = $format->() if ref $format;
209     $format = sprintf $format, @args if @args;
210     $format =~ s/\n$//;
211     $now = AE::now;
212     };
213    
214     # format msg
215     my $str = $ctx->[4]
216     ? $ctx->[4]($now, $_[0], $level, $format)
217     : $fmt ||= _format $now, $_[0], $level, $format;
218    
219     $ctx->[3]($str);
220     }
221    
222     # not masked, not consumed - propagate to parent contexts
223     push @ctx, values %{ $ctx->[2] };
224     }
225 root 1.8 }
226 root 1.11 while $ctx = pop @ctx;
227 root 1.2
228     exit 1 if $level <= 1;
229     }
230    
231 root 1.3 sub log($$;@) {
232 root 1.8 _log
233     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
234     @_;
235 root 1.3 }
236    
237 root 1.2 *AnyEvent::log = *AE::log = \&log;
238    
239 root 1.3 =item $logger = AnyEvent::Log::logger $level[, \$enabled]
240    
241     Creates a code reference that, when called, acts as if the
242     C<AnyEvent::Log::log> function was called at this point with the givne
243     level. C<$logger> is passed a C<$msg> and optional C<@args>, just as with
244     the C<AnyEvent::Log::log> function:
245    
246     my $debug_log = AnyEvent::Log::logger "debug";
247    
248     $debug_log->("debug here");
249     $debug_log->("%06d emails processed", 12345);
250     $debug_log->(sub { $obj->as_string });
251    
252     The idea behind this function is to decide whether to log before actually
253     logging - when the C<logger> function is called once, but the returned
254     logger callback often, then this can be a tremendous speed win.
255    
256     Despite this speed advantage, changes in logging configuration will
257     still be reflected by the logger callback, even if configuration changes
258     I<after> it was created.
259    
260     To further speed up logging, you can bind a scalar variable to the logger,
261     which contains true if the logger should be called or not - if it is
262     false, calling the logger can be safely skipped. This variable will be
263     updated as long as C<$logger> is alive.
264    
265     Full example:
266    
267     # near the init section
268     use AnyEvent::Log;
269    
270     my $debug_log = AnyEvent:Log::logger debug => \my $debug;
271    
272     # and later in your program
273     $debug_log->("yo, stuff here") if $debug;
274    
275     $debug and $debug_log->("123");
276    
277     =cut
278    
279     our %LOGGER;
280    
281     # re-assess logging status for all loggers
282     sub _reassess {
283     for (@_ ? $LOGGER{$_[0]} : values %LOGGER) {
284 root 1.8 my ($ctx, $level, $renabled) = @$_;
285 root 1.3
286 root 1.11 # to detect whether a message would be logged, we # actually
287     # try to log one and die. this isn't fast, but we can be
288 root 1.3 # sure that the logging decision is correct :)
289    
290     $$renabled = !eval {
291     local $SIG{__DIE__};
292    
293 root 1.8 _log $ctx, $level, sub { die };
294 root 1.3
295     1
296     };
297    
298     $$renabled = 1; # TODO
299     }
300     }
301    
302 root 1.15 sub _logger {
303 root 1.8 my ($ctx, $level, $renabled) = @_;
304 root 1.3
305     $$renabled = 1;
306    
307 root 1.8 my $logger = [$ctx, $level, $renabled];
308 root 1.3
309     $LOGGER{$logger+0} = $logger;
310    
311     _reassess $logger+0;
312    
313     my $guard = AnyEvent::Util::guard {
314     # "clean up"
315     delete $LOGGER{$logger+0};
316     };
317    
318     sub {
319     $guard if 0; # keep guard alive, but don't cause runtime overhead
320    
321 root 1.8 _log $ctx, $level, @_
322 root 1.3 if $$renabled;
323     }
324     }
325    
326 root 1.8 sub logger($;$) {
327     _logger
328     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
329     @_
330     }
331    
332 root 1.2 =back
333    
334 root 1.9 =head1 LOGGING CONTEXTS
335 root 1.2
336 root 1.9 This module associates every log message with a so-called I<logging
337     context>, based on the package of the caller. Every perl package has its
338     own logging context.
339 root 1.8
340 root 1.10 A logging context has three major responsibilities: filtering, logging and
341     propagating the message.
342 root 1.9
343 root 1.10 For the first purpose, filtering, each context has a set of logging
344     levels, called the log level mask. Messages not in the set will be ignored
345     by this context (masked).
346    
347     For logging, the context stores a formatting callback (which takes the
348     timestamp, context, level and string message and formats it in the way
349     it should be logged) and a logging callback (which is responsible for
350     actually logging the formatted message and telling C<AnyEvent::Log>
351     whether it has consumed the message, or whether it should be propagated).
352 root 1.9
353     For propagation, a context can have any number of attached I<parent
354 root 1.10 contexts>. Any message that is neither masked by the logging mask nor
355     masked by the logging callback returning true will be passed to all parent
356     contexts.
357 root 1.9
358 root 1.11 Each call to a logging function will log the message at most once per
359     context, so it does not matter (much) if there are cycles or if the
360     message can arrive at the same context via multiple paths.
361    
362 root 1.9 =head2 DEFAULTS
363    
364 root 1.10 By default, all logging contexts have an full set of log levels ("all"), a
365 root 1.9 disabled logging callback and the default formatting callback.
366    
367     Package contexts have the package name as logging title by default.
368    
369     They have exactly one parent - the context of the "parent" package. The
370     parent package is simply defined to be the package name without the last
371     component, i.e. C<AnyEvent::Debug::Wrapped> becomes C<AnyEvent::Debug>,
372 root 1.11 and C<AnyEvent> becomes ... C<AnyEvent::Log::Top> which is the
373     exception of the rule - just like the parent of any package name in
374 root 1.12 Perl is C<main>, the default parent of any top-level package context is
375 root 1.11 C<AnyEvent::Log::Top>.
376 root 1.9
377     Since perl packages form only an approximate hierarchy, this parent
378     context can of course be removed.
379    
380     All other (anonymous) contexts have no parents and an empty title by
381     default.
382    
383 root 1.11 When the module is loaded it creates the default context called
384 root 1.12 C<AnyEvent::Log::Default> (also stored in C<$AnyEvent::Log::Default>),
385 root 1.15 which simply logs everything via C<warn> and doesn't propagate anything
386 root 1.12 anywhere by default. The purpose of the default context is to provide
387     a convenient place to override the global logging target or to attach
388     additional log targets. It's not meant for filtering.
389    
390     It then creates the root context called C<AnyEvent::Log::Root> (also
391     stored in C<$AnyEvent::Log::Root>) and sets its log level set to all
392     levels up to the one specified by C<$ENV{PERL_ANYEVENT_VERBOSE}>. It
393     then attached the default logging context to it. The purpose of the root
394     context is to simply provide filtering according to some global log level.
395    
396     Finally it creates the top-level package context called
397     C<AnyEvent::Log::Top> (also stored in, you might have guessed,
398     C<$AnyEvent::Log::Top>) and attached the root context but otherwise leaves
399 root 1.11 it at default config. It's purpose is simply to collect all log messages
400     system-wide.
401    
402 root 1.12 These three special contexts can also be referred to by the
403     package/context names C<AE::Log::Default>, C<AE::Log::Root> and
404     C<AE::Log::Top>.
405 root 1.11
406     The effect of all this is that log messages, by default, wander up
407     to the root context where log messages with lower priority then
408     C<$ENV{PERL_ANYEVENT_VERBOSE}> will be filtered away and then to the
409 root 1.15 AnyEvent::Log::Default context to be passed to C<warn>.
410 root 1.11
411     Splitting the top level context into three contexts makes it easy to set
412     a global logging level (by modifying the root context), but still allow
413     other contexts to log, for example, their debug and trace messages to the
414     default target despite the global logging level, or to attach additional
415     log targets that log messages, regardless of the global logging level.
416    
417 root 1.15 It also makes it easy to replace the default warn-logger by something that
418     logs to a file, or to attach additional logging targets.
419 root 1.9
420 root 1.11 =head2 CREATING/FINDING/DESTROYING CONTEXTS
421 root 1.2
422     =over 4
423    
424 root 1.8 =item $ctx = AnyEvent::Log::ctx [$pkg]
425    
426 root 1.9 This function creates or returns a logging context (which is an object).
427 root 1.8
428 root 1.9 If a package name is given, then the context for that packlage is
429     returned. If it is called without any arguments, then the context for the
430     callers package is returned (i.e. the same context as a C<AE::log> call
431     would use).
432 root 1.8
433     If C<undef> is given, then it creates a new anonymous context that is not
434     tied to any package and is destroyed when no longer referenced.
435    
436     =cut
437    
438     sub ctx(;$) {
439     my $pkg = @_ ? shift : (caller)[0];
440    
441     ref $pkg
442     ? $pkg
443     : defined $pkg
444     ? $CTX{$pkg} ||= AnyEvent::Log::_pkg_ctx $pkg
445 root 1.10 : bless [undef, (1 << 10) - 1 - 1], "AnyEvent::Log::Ctx"
446 root 1.8 }
447    
448 root 1.11 =item AnyEvent::Log::reset
449    
450 root 1.16 Resets all package contexts and recreates the default hierarchy if
451     necessary, i.e. resets the logging subsystem to defaults, as much as
452     possible. This process keeps references to contexts held by other parts of
453     the program intact.
454 root 1.11
455     This can be used to implement config-file (re-)loading: before loading a
456     configuration, reset all contexts.
457    
458     =cut
459    
460     sub reset {
461 root 1.15 # hard to kill complex data structures
462     # we recreate all package loggers and reset the hierarchy
463     while (my ($k, $v) = each %CTX) {
464     @$v = ($k, (1 << 10) - 1 - 1, { });
465    
466     my $pkg = $k =~ /^(.+)::/ ? $1 : "AE::Log::Top";
467     $v->attach ($CTX{$pkg});
468     }
469 root 1.11
470 root 1.15 $AnyEvent::Log::Default->parents;
471     $AnyEvent::Log::Default->title ("AnyEvent::Log::Default");
472     $AnyEvent::Log::Default->log_cb (sub {
473     warn shift;
474 root 1.8 0
475     });
476 root 1.15 $CTX{"AnyEvent::Log::Default"} = $CTX{"AE::Log::Default"} = $AnyEvent::Log::Default;
477    
478     $AnyEvent::Log::Root->parents ($AnyEvent::Log::Default);
479     $AnyEvent::Log::Root->title ("AnyEvent::Log::Root");
480     $AnyEvent::Log::Root->level ($AnyEvent::VERBOSE);
481     $CTX{"AnyEvent::Log::Root"} = $CTX{"AE::Log::Root"} = $AnyEvent::Log::Root;
482 root 1.11
483 root 1.15 $AnyEvent::Log::Top->parents ($AnyEvent::Log::Root);
484     $AnyEvent::Log::Top->title ("AnyEvent::Log::Top");
485     $CTX{"AnyEvent::Log::Top"} = $CTX{"AE::Log::Top"} = $AnyEvent::Log::Top;
486    
487     _reassess;
488 root 1.11 }
489    
490 root 1.15 # create the default logger contexts
491     $AnyEvent::Log::Default = ctx undef;
492     $AnyEvent::Log::Root = ctx undef;
493     $AnyEvent::Log::Top = ctx undef;
494    
495 root 1.11 AnyEvent::Log::reset;
496    
497 root 1.12 # hello, CPAN, please catch me
498 root 1.11 package AnyEvent::Log::Default;
499     package AE::Log::Default;
500     package AnyEvent::Log::Root;
501     package AE::Log::Root;
502     package AnyEvent::Log::Top;
503     package AE::Log::Top;
504 root 1.8
505 root 1.12 package AnyEvent::Log::Ctx;
506    
507     # 0 1 2 3 4
508     # [$title, $level, %$parents, &$logcb, &$fmtcb]
509    
510     =item $ctx = new AnyEvent::Log::Ctx methodname => param...
511    
512     This is a convenience constructor that makes it simpler to construct
513     anonymous logging contexts.
514    
515     Each key-value pair results in an invocation of the method of the same
516     name as the key with the value as parameter, unless the value is an
517     arrayref, in which case it calls the method with the contents of the
518     array. The methods are called in the same order as specified.
519    
520     Example: create a new logging context and set both the default logging
521     level, some parent contexts and a logging callback.
522    
523     $ctx = new AnyEvent::Log::Ctx
524     title => "dubious messages",
525     level => "error",
526     log_cb => sub { print STDOUT shift; 0 },
527     parents => [$ctx1, $ctx, $ctx2],
528     ;
529    
530 root 1.9 =back
531    
532     =cut
533    
534 root 1.12 sub new {
535     my $class = shift;
536    
537     my $ctx = AnyEvent::Log::ctx undef;
538    
539     while (@_) {
540     my ($k, $v) = splice @_, 0, 2;
541     $ctx->$k (ref $v eq "ARRAY" ? @$v : $v);
542     }
543    
544     bless $ctx, $class # do we really support subclassing, hmm?
545     }
546 root 1.8
547    
548 root 1.9 =head2 CONFIGURING A LOG CONTEXT
549    
550     The following methods can be used to configure the logging context.
551    
552     =over 4
553    
554 root 1.8 =item $ctx->title ([$new_title])
555    
556     Returns the title of the logging context - this is the package name, for
557     package contexts, and a user defined string for all others.
558    
559     If C<$new_title> is given, then it replaces the package name or title.
560    
561     =cut
562    
563     sub title {
564     $_[0][0] = $_[1] if @_ > 1;
565     $_[0][0]
566     }
567    
568 root 1.9 =back
569    
570     =head3 LOGGING LEVELS
571    
572 root 1.10 The following methods deal with the logging level set associated with the
573     log context.
574 root 1.9
575     The most common method to use is probably C<< $ctx->level ($level) >>,
576     which configures the specified and any higher priority levels.
577    
578 root 1.10 All functions which accept a list of levels also accept the special string
579     C<all> which expands to all logging levels.
580    
581 root 1.9 =over 4
582    
583 root 1.8 =item $ctx->levels ($level[, $level...)
584    
585 root 1.10 Enables logging for the given levels and disables it for all others.
586 root 1.8
587     =item $ctx->level ($level)
588    
589     Enables logging for the given level and all lower level (higher priority)
590 root 1.10 ones. In addition to normal logging levels, specifying a level of C<0> or
591     C<off> disables all logging for this level.
592 root 1.8
593     Example: log warnings, errors and higher priority messages.
594    
595     $ctx->level ("warn");
596     $ctx->level (5); # same thing, just numeric
597    
598     =item $ctx->enable ($level[, $level...])
599    
600     Enables logging for the given levels, leaving all others unchanged.
601 root 1.5
602 root 1.8 =item $ctx->disable ($level[, $level...])
603    
604     Disables logging for the given levels, leaving all others unchanged.
605    
606     =cut
607    
608     sub _lvl_lst {
609 root 1.10 map {
610     $_ > 0 && $_ <= 9 ? $_+0
611     : $_ eq "all" ? (1 .. 9)
612     : $STR2LEVEL{$_} || Carp::croak "$_: not a valid logging level, caught"
613     } @_
614 root 1.8 }
615    
616     our $NOP_CB = sub { 0 };
617    
618     sub levels {
619     my $ctx = shift;
620     $ctx->[1] = 0;
621     $ctx->[1] |= 1 << $_
622     for &_lvl_lst;
623     AnyEvent::Log::_reassess;
624     }
625    
626     sub level {
627     my $ctx = shift;
628 root 1.10 my $lvl = $_[0] =~ /^(?:0|off|none)$/ ? 0 : (_lvl_lst $_[0])[-1];
629    
630 root 1.8 $ctx->[1] = ((1 << $lvl) - 1) << 1;
631     AnyEvent::Log::_reassess;
632     }
633    
634     sub enable {
635     my $ctx = shift;
636     $ctx->[1] |= 1 << $_
637     for &_lvl_lst;
638     AnyEvent::Log::_reassess;
639     }
640    
641     sub disable {
642     my $ctx = shift;
643     $ctx->[1] &= ~(1 << $_)
644     for &_lvl_lst;
645     AnyEvent::Log::_reassess;
646     }
647    
648 root 1.9 =back
649    
650     =head3 PARENT CONTEXTS
651    
652     The following methods attach and detach another logging context to a
653     logging context.
654    
655     Log messages are propagated to all parent contexts, unless the logging
656     callback consumes the message.
657    
658     =over 4
659    
660 root 1.8 =item $ctx->attach ($ctx2[, $ctx3...])
661    
662     Attaches the given contexts as parents to this context. It is not an error
663     to add a context twice (the second add will be ignored).
664    
665     A context can be specified either as package name or as a context object.
666    
667     =item $ctx->detach ($ctx2[, $ctx3...])
668    
669     Removes the given parents from this context - it's not an error to attempt
670     to remove a context that hasn't been added.
671    
672     A context can be specified either as package name or as a context object.
673 root 1.5
674 root 1.11 =item $ctx->parents ($ctx2[, $ctx3...])
675    
676     Replaces all parents attached to this context by the ones given.
677    
678 root 1.2 =cut
679    
680 root 1.8 sub attach {
681     my $ctx = shift;
682    
683     $ctx->[2]{$_+0} = $_
684     for map { AnyEvent::Log::ctx $_ } @_;
685     }
686    
687     sub detach {
688     my $ctx = shift;
689    
690     delete $ctx->[2]{$_+0}
691     for map { AnyEvent::Log::ctx $_ } @_;
692     }
693    
694 root 1.11 sub parents {
695     undef $_[0][2];
696     &attach;
697     }
698    
699 root 1.9 =back
700    
701     =head3 MESSAGE LOGGING
702    
703     The following methods configure how the logging context actually does
704 root 1.10 the logging (which consists of formatting the message and printing it or
705 root 1.9 whatever it wants to do with it) and also allows you to log messages
706     directly to a context, without going via your package context.
707    
708     =over 4
709    
710 root 1.8 =item $ctx->log_cb ($cb->($str))
711 root 1.5
712 root 1.8 Replaces the logging callback on the context (C<undef> disables the
713     logging callback).
714 root 1.5
715 root 1.8 The logging callback is responsible for handling formatted log messages
716     (see C<fmt_cb> below) - normally simple text strings that end with a
717     newline (and are possibly multiline themselves).
718    
719     It also has to return true iff it has consumed the log message, and false
720     if it hasn't. Consuming a message means that it will not be sent to any
721     parent context. When in doubt, return C<0> from your logging callback.
722    
723     Example: a very simple logging callback, simply dump the message to STDOUT
724     and do not consume it.
725    
726     $ctx->log_cb (sub { print STDERR shift; 0 });
727    
728 root 1.10 You can filter messages by having a log callback that simply returns C<1>
729     and does not do anything with the message, but this counts as "message
730     being logged" and might not be very efficient.
731    
732     Example: propagate all messages except for log levels "debug" and
733     "trace". The messages will still be generated, though, which can slow down
734     your program.
735    
736     $ctx->levels ("debug", "trace");
737     $ctx->log_cb (sub { 1 }); # do not log, but eat debug and trace messages
738    
739 root 1.8 =item $ctx->fmt_cb ($fmt_cb->($timestamp, $ctx, $level, $message))
740    
741 root 1.10 Replaces the formatting callback on the context (C<undef> restores the
742 root 1.8 default formatter).
743    
744     The callback is passed the (possibly fractional) timestamp, the original
745     logging context, the (numeric) logging level and the raw message string and needs to
746     return a formatted log message. In most cases this will be a string, but
747     it could just as well be an array reference that just stores the values.
748    
749     Example: format just the raw message, with numeric log level in angle
750     brackets.
751    
752     $ctx->fmt_cb (sub {
753     my ($time, $ctx, $lvl, $msg) = @_;
754    
755     "<$lvl>$msg\n"
756     });
757    
758     Example: return an array reference with just the log values, and use
759     C<PApp::SQL::sql_exec> to store the emssage in a database.
760    
761     $ctx->fmt_cb (sub { \@_ });
762     $ctx->log_cb (sub {
763     my ($msg) = @_;
764    
765     sql_exec "insert into log (when, subsys, prio, msg) values (?, ?, ?, ?)",
766     $msg->[0] + 0,
767     "$msg->[1]",
768     $msg->[2] + 0,
769     "$msg->[3]";
770    
771     0
772     });
773    
774     =cut
775    
776     sub log_cb {
777     my ($ctx, $cb) = @_;
778 root 1.6
779 root 1.10 $ctx->[3] = $cb;
780 root 1.6 }
781 root 1.5
782 root 1.8 sub fmt_cb {
783     my ($ctx, $cb) = @_;
784 root 1.6
785 root 1.8 $ctx->[4] = $cb;
786 root 1.5 }
787    
788 root 1.8 =item $ctx->log ($level, $msg[, @params])
789    
790     Same as C<AnyEvent::Log::log>, but uses the given context as log context.
791    
792     =item $logger = $ctx->logger ($level[, \$enabled])
793    
794     Same as C<AnyEvent::Log::logger>, but uses the given context as log
795     context.
796    
797     =cut
798    
799     *log = \&AnyEvent::Log::_log;
800     *logger = \&AnyEvent::Log::_logger;
801    
802 root 1.1 1;
803    
804     =back
805    
806 root 1.12 =head1 EXAMPLES
807    
808     This section shows some common configurations.
809    
810     =over 4
811    
812     =item Setting the global logging level.
813    
814     Either put PERL_ANYEVENT_VERBOSE=<number> into your environment before
815     running your program, or modify the log level of the root context:
816    
817     PERL_ANYEVENT_VERBOSE=5 ./myprog
818    
819     $AnyEvent::Log::Root->level ("warn");
820    
821     =item Append all messages to a file instead of sending them to STDERR.
822    
823     This is affected by the global logging level.
824    
825     open my $fh, ">>", $path
826     or die "$path: $!";
827    
828     $AnyEvent::Log::Default->log_cb (sub {
829     syswrite $fh, shift;
830     0
831     });
832    
833     =item Write all messages with priority C<error> and higher to a file.
834    
835     This writes them only when the global logging level allows it, because
836     it is attached to the default context which is invoked I<after> global
837     filtering.
838    
839     open my $fh, ">>", $path
840     or die "$path: $!";
841    
842     $AnyEvent::Log::Default->attach (new AnyEvent::Log::Ctx
843     log_cb => sub { syswrite $fh, shift; 0 });
844    
845     This writes them regardless of the global logging level, because it is
846     attached to the toplevel context, which receives all messages I<before>
847     the global filtering.
848    
849     $AnyEvent::Log::Top->attach (new AnyEvent::Log::Ctx
850     log_cb => sub { syswrite $fh, shift; 0 });
851    
852     In both cases, messages are still written to STDOUT.
853    
854     =item Write trace messages (only) from L<AnyEvent::Debug> to the default logging target(s).
855    
856     Attach the CyAnyEvent::Log::Default> context to the C<AnyEvent::Debug>
857     context and increase the C<AnyEvent::Debug> logging level - this simply
858     circumvents the global filtering for trace messages.
859    
860     my $debug = AnyEvent::Debug->AnyEvent::Log::ctx;
861     $debug->attach ($AnyEvent::Log::Default);
862     $debug->levels ("trace"); # not "level"!
863    
864 root 1.13 This of course works for any package.
865    
866 root 1.12 =back
867    
868 root 1.1 =head1 AUTHOR
869    
870     Marc Lehmann <schmorp@schmorp.de>
871     http://home.schmorp.de/
872    
873     =cut