ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Log.pm
Revision: 1.17
Committed: Sat Aug 20 02:21:53 2011 UTC (12 years, 10 months ago) by root
Branch: MAIN
Changes since 1.16: +5 -6 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 root 1.17 local $SIG{__DIE__};
284     my $die = sub { die };
285    
286 root 1.3 for (@_ ? $LOGGER{$_[0]} : values %LOGGER) {
287 root 1.8 my ($ctx, $level, $renabled) = @$_;
288 root 1.3
289 root 1.17 # to detect whether a message would be logged, we actually
290 root 1.11 # try to log one and die. this isn't fast, but we can be
291 root 1.3 # sure that the logging decision is correct :)
292    
293     $$renabled = !eval {
294 root 1.17 _log $ctx, $level, $die;
295 root 1.3
296     1
297     };
298     }
299     }
300    
301 root 1.15 sub _logger {
302 root 1.8 my ($ctx, $level, $renabled) = @_;
303 root 1.3
304     $$renabled = 1;
305    
306 root 1.8 my $logger = [$ctx, $level, $renabled];
307 root 1.3
308     $LOGGER{$logger+0} = $logger;
309    
310     _reassess $logger+0;
311    
312     my $guard = AnyEvent::Util::guard {
313     # "clean up"
314     delete $LOGGER{$logger+0};
315     };
316    
317     sub {
318     $guard if 0; # keep guard alive, but don't cause runtime overhead
319    
320 root 1.8 _log $ctx, $level, @_
321 root 1.3 if $$renabled;
322     }
323     }
324    
325 root 1.8 sub logger($;$) {
326     _logger
327     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
328     @_
329     }
330    
331 root 1.2 =back
332    
333 root 1.9 =head1 LOGGING CONTEXTS
334 root 1.2
335 root 1.9 This module associates every log message with a so-called I<logging
336     context>, based on the package of the caller. Every perl package has its
337     own logging context.
338 root 1.8
339 root 1.10 A logging context has three major responsibilities: filtering, logging and
340     propagating the message.
341 root 1.9
342 root 1.10 For the first purpose, filtering, each context has a set of logging
343     levels, called the log level mask. Messages not in the set will be ignored
344     by this context (masked).
345    
346     For logging, the context stores a formatting callback (which takes the
347     timestamp, context, level and string message and formats it in the way
348     it should be logged) and a logging callback (which is responsible for
349     actually logging the formatted message and telling C<AnyEvent::Log>
350     whether it has consumed the message, or whether it should be propagated).
351 root 1.9
352     For propagation, a context can have any number of attached I<parent
353 root 1.10 contexts>. Any message that is neither masked by the logging mask nor
354     masked by the logging callback returning true will be passed to all parent
355     contexts.
356 root 1.9
357 root 1.11 Each call to a logging function will log the message at most once per
358     context, so it does not matter (much) if there are cycles or if the
359     message can arrive at the same context via multiple paths.
360    
361 root 1.9 =head2 DEFAULTS
362    
363 root 1.10 By default, all logging contexts have an full set of log levels ("all"), a
364 root 1.9 disabled logging callback and the default formatting callback.
365    
366     Package contexts have the package name as logging title by default.
367    
368     They have exactly one parent - the context of the "parent" package. The
369     parent package is simply defined to be the package name without the last
370     component, i.e. C<AnyEvent::Debug::Wrapped> becomes C<AnyEvent::Debug>,
371 root 1.11 and C<AnyEvent> becomes ... C<AnyEvent::Log::Top> which is the
372     exception of the rule - just like the parent of any package name in
373 root 1.12 Perl is C<main>, the default parent of any top-level package context is
374 root 1.11 C<AnyEvent::Log::Top>.
375 root 1.9
376     Since perl packages form only an approximate hierarchy, this parent
377     context can of course be removed.
378    
379     All other (anonymous) contexts have no parents and an empty title by
380     default.
381    
382 root 1.11 When the module is loaded it creates the default context called
383 root 1.12 C<AnyEvent::Log::Default> (also stored in C<$AnyEvent::Log::Default>),
384 root 1.15 which simply logs everything via C<warn> and doesn't propagate anything
385 root 1.12 anywhere by default. The purpose of the default context is to provide
386     a convenient place to override the global logging target or to attach
387     additional log targets. It's not meant for filtering.
388    
389     It then creates the root context called C<AnyEvent::Log::Root> (also
390     stored in C<$AnyEvent::Log::Root>) and sets its log level set to all
391     levels up to the one specified by C<$ENV{PERL_ANYEVENT_VERBOSE}>. It
392     then attached the default logging context to it. The purpose of the root
393     context is to simply provide filtering according to some global log level.
394    
395     Finally it creates the top-level package context called
396     C<AnyEvent::Log::Top> (also stored in, you might have guessed,
397     C<$AnyEvent::Log::Top>) and attached the root context but otherwise leaves
398 root 1.11 it at default config. It's purpose is simply to collect all log messages
399     system-wide.
400    
401 root 1.12 These three special contexts can also be referred to by the
402     package/context names C<AE::Log::Default>, C<AE::Log::Root> and
403     C<AE::Log::Top>.
404 root 1.11
405     The effect of all this is that log messages, by default, wander up
406     to the root context where log messages with lower priority then
407     C<$ENV{PERL_ANYEVENT_VERBOSE}> will be filtered away and then to the
408 root 1.15 AnyEvent::Log::Default context to be passed to C<warn>.
409 root 1.11
410     Splitting the top level context into three contexts makes it easy to set
411     a global logging level (by modifying the root context), but still allow
412     other contexts to log, for example, their debug and trace messages to the
413     default target despite the global logging level, or to attach additional
414     log targets that log messages, regardless of the global logging level.
415    
416 root 1.15 It also makes it easy to replace the default warn-logger by something that
417     logs to a file, or to attach additional logging targets.
418 root 1.9
419 root 1.11 =head2 CREATING/FINDING/DESTROYING CONTEXTS
420 root 1.2
421     =over 4
422    
423 root 1.8 =item $ctx = AnyEvent::Log::ctx [$pkg]
424    
425 root 1.9 This function creates or returns a logging context (which is an object).
426 root 1.8
427 root 1.9 If a package name is given, then the context for that packlage is
428     returned. If it is called without any arguments, then the context for the
429     callers package is returned (i.e. the same context as a C<AE::log> call
430     would use).
431 root 1.8
432     If C<undef> is given, then it creates a new anonymous context that is not
433     tied to any package and is destroyed when no longer referenced.
434    
435     =cut
436    
437     sub ctx(;$) {
438     my $pkg = @_ ? shift : (caller)[0];
439    
440     ref $pkg
441     ? $pkg
442     : defined $pkg
443     ? $CTX{$pkg} ||= AnyEvent::Log::_pkg_ctx $pkg
444 root 1.10 : bless [undef, (1 << 10) - 1 - 1], "AnyEvent::Log::Ctx"
445 root 1.8 }
446    
447 root 1.11 =item AnyEvent::Log::reset
448    
449 root 1.16 Resets all package contexts and recreates the default hierarchy if
450     necessary, i.e. resets the logging subsystem to defaults, as much as
451     possible. This process keeps references to contexts held by other parts of
452     the program intact.
453 root 1.11
454     This can be used to implement config-file (re-)loading: before loading a
455     configuration, reset all contexts.
456    
457     =cut
458    
459     sub reset {
460 root 1.15 # hard to kill complex data structures
461     # we recreate all package loggers and reset the hierarchy
462     while (my ($k, $v) = each %CTX) {
463     @$v = ($k, (1 << 10) - 1 - 1, { });
464    
465     my $pkg = $k =~ /^(.+)::/ ? $1 : "AE::Log::Top";
466     $v->attach ($CTX{$pkg});
467     }
468 root 1.11
469 root 1.15 $AnyEvent::Log::Default->parents;
470     $AnyEvent::Log::Default->title ("AnyEvent::Log::Default");
471     $AnyEvent::Log::Default->log_cb (sub {
472     warn shift;
473 root 1.8 0
474     });
475 root 1.15 $CTX{"AnyEvent::Log::Default"} = $CTX{"AE::Log::Default"} = $AnyEvent::Log::Default;
476    
477     $AnyEvent::Log::Root->parents ($AnyEvent::Log::Default);
478     $AnyEvent::Log::Root->title ("AnyEvent::Log::Root");
479     $AnyEvent::Log::Root->level ($AnyEvent::VERBOSE);
480     $CTX{"AnyEvent::Log::Root"} = $CTX{"AE::Log::Root"} = $AnyEvent::Log::Root;
481 root 1.11
482 root 1.15 $AnyEvent::Log::Top->parents ($AnyEvent::Log::Root);
483     $AnyEvent::Log::Top->title ("AnyEvent::Log::Top");
484     $CTX{"AnyEvent::Log::Top"} = $CTX{"AE::Log::Top"} = $AnyEvent::Log::Top;
485    
486     _reassess;
487 root 1.11 }
488    
489 root 1.15 # create the default logger contexts
490     $AnyEvent::Log::Default = ctx undef;
491     $AnyEvent::Log::Root = ctx undef;
492     $AnyEvent::Log::Top = ctx undef;
493    
494 root 1.11 AnyEvent::Log::reset;
495    
496 root 1.12 # hello, CPAN, please catch me
497 root 1.11 package AnyEvent::Log::Default;
498     package AE::Log::Default;
499     package AnyEvent::Log::Root;
500     package AE::Log::Root;
501     package AnyEvent::Log::Top;
502     package AE::Log::Top;
503 root 1.8
504 root 1.12 package AnyEvent::Log::Ctx;
505    
506     # 0 1 2 3 4
507     # [$title, $level, %$parents, &$logcb, &$fmtcb]
508    
509     =item $ctx = new AnyEvent::Log::Ctx methodname => param...
510    
511     This is a convenience constructor that makes it simpler to construct
512     anonymous logging contexts.
513    
514     Each key-value pair results in an invocation of the method of the same
515     name as the key with the value as parameter, unless the value is an
516     arrayref, in which case it calls the method with the contents of the
517     array. The methods are called in the same order as specified.
518    
519     Example: create a new logging context and set both the default logging
520     level, some parent contexts and a logging callback.
521    
522     $ctx = new AnyEvent::Log::Ctx
523     title => "dubious messages",
524     level => "error",
525     log_cb => sub { print STDOUT shift; 0 },
526     parents => [$ctx1, $ctx, $ctx2],
527     ;
528    
529 root 1.9 =back
530    
531     =cut
532    
533 root 1.12 sub new {
534     my $class = shift;
535    
536     my $ctx = AnyEvent::Log::ctx undef;
537    
538     while (@_) {
539     my ($k, $v) = splice @_, 0, 2;
540     $ctx->$k (ref $v eq "ARRAY" ? @$v : $v);
541     }
542    
543     bless $ctx, $class # do we really support subclassing, hmm?
544     }
545 root 1.8
546    
547 root 1.9 =head2 CONFIGURING A LOG CONTEXT
548    
549     The following methods can be used to configure the logging context.
550    
551     =over 4
552    
553 root 1.8 =item $ctx->title ([$new_title])
554    
555     Returns the title of the logging context - this is the package name, for
556     package contexts, and a user defined string for all others.
557    
558     If C<$new_title> is given, then it replaces the package name or title.
559    
560     =cut
561    
562     sub title {
563     $_[0][0] = $_[1] if @_ > 1;
564     $_[0][0]
565     }
566    
567 root 1.9 =back
568    
569     =head3 LOGGING LEVELS
570    
571 root 1.10 The following methods deal with the logging level set associated with the
572     log context.
573 root 1.9
574     The most common method to use is probably C<< $ctx->level ($level) >>,
575     which configures the specified and any higher priority levels.
576    
577 root 1.10 All functions which accept a list of levels also accept the special string
578     C<all> which expands to all logging levels.
579    
580 root 1.9 =over 4
581    
582 root 1.8 =item $ctx->levels ($level[, $level...)
583    
584 root 1.10 Enables logging for the given levels and disables it for all others.
585 root 1.8
586     =item $ctx->level ($level)
587    
588     Enables logging for the given level and all lower level (higher priority)
589 root 1.10 ones. In addition to normal logging levels, specifying a level of C<0> or
590     C<off> disables all logging for this level.
591 root 1.8
592     Example: log warnings, errors and higher priority messages.
593    
594     $ctx->level ("warn");
595     $ctx->level (5); # same thing, just numeric
596    
597     =item $ctx->enable ($level[, $level...])
598    
599     Enables logging for the given levels, leaving all others unchanged.
600 root 1.5
601 root 1.8 =item $ctx->disable ($level[, $level...])
602    
603     Disables logging for the given levels, leaving all others unchanged.
604    
605     =cut
606    
607     sub _lvl_lst {
608 root 1.10 map {
609     $_ > 0 && $_ <= 9 ? $_+0
610     : $_ eq "all" ? (1 .. 9)
611     : $STR2LEVEL{$_} || Carp::croak "$_: not a valid logging level, caught"
612     } @_
613 root 1.8 }
614    
615     our $NOP_CB = sub { 0 };
616    
617     sub levels {
618     my $ctx = shift;
619     $ctx->[1] = 0;
620     $ctx->[1] |= 1 << $_
621     for &_lvl_lst;
622     AnyEvent::Log::_reassess;
623     }
624    
625     sub level {
626     my $ctx = shift;
627 root 1.10 my $lvl = $_[0] =~ /^(?:0|off|none)$/ ? 0 : (_lvl_lst $_[0])[-1];
628    
629 root 1.8 $ctx->[1] = ((1 << $lvl) - 1) << 1;
630     AnyEvent::Log::_reassess;
631     }
632    
633     sub enable {
634     my $ctx = shift;
635     $ctx->[1] |= 1 << $_
636     for &_lvl_lst;
637     AnyEvent::Log::_reassess;
638     }
639    
640     sub disable {
641     my $ctx = shift;
642     $ctx->[1] &= ~(1 << $_)
643     for &_lvl_lst;
644     AnyEvent::Log::_reassess;
645     }
646    
647 root 1.9 =back
648    
649     =head3 PARENT CONTEXTS
650    
651     The following methods attach and detach another logging context to a
652     logging context.
653    
654     Log messages are propagated to all parent contexts, unless the logging
655     callback consumes the message.
656    
657     =over 4
658    
659 root 1.8 =item $ctx->attach ($ctx2[, $ctx3...])
660    
661     Attaches the given contexts as parents to this context. It is not an error
662     to add a context twice (the second add will be ignored).
663    
664     A context can be specified either as package name or as a context object.
665    
666     =item $ctx->detach ($ctx2[, $ctx3...])
667    
668     Removes the given parents from this context - it's not an error to attempt
669     to remove a context that hasn't been added.
670    
671     A context can be specified either as package name or as a context object.
672 root 1.5
673 root 1.11 =item $ctx->parents ($ctx2[, $ctx3...])
674    
675     Replaces all parents attached to this context by the ones given.
676    
677 root 1.2 =cut
678    
679 root 1.8 sub attach {
680     my $ctx = shift;
681    
682     $ctx->[2]{$_+0} = $_
683     for map { AnyEvent::Log::ctx $_ } @_;
684     }
685    
686     sub detach {
687     my $ctx = shift;
688    
689     delete $ctx->[2]{$_+0}
690     for map { AnyEvent::Log::ctx $_ } @_;
691     }
692    
693 root 1.11 sub parents {
694     undef $_[0][2];
695     &attach;
696     }
697    
698 root 1.9 =back
699    
700     =head3 MESSAGE LOGGING
701    
702     The following methods configure how the logging context actually does
703 root 1.10 the logging (which consists of formatting the message and printing it or
704 root 1.9 whatever it wants to do with it) and also allows you to log messages
705     directly to a context, without going via your package context.
706    
707     =over 4
708    
709 root 1.8 =item $ctx->log_cb ($cb->($str))
710 root 1.5
711 root 1.8 Replaces the logging callback on the context (C<undef> disables the
712     logging callback).
713 root 1.5
714 root 1.8 The logging callback is responsible for handling formatted log messages
715     (see C<fmt_cb> below) - normally simple text strings that end with a
716     newline (and are possibly multiline themselves).
717    
718     It also has to return true iff it has consumed the log message, and false
719     if it hasn't. Consuming a message means that it will not be sent to any
720     parent context. When in doubt, return C<0> from your logging callback.
721    
722     Example: a very simple logging callback, simply dump the message to STDOUT
723     and do not consume it.
724    
725     $ctx->log_cb (sub { print STDERR shift; 0 });
726    
727 root 1.10 You can filter messages by having a log callback that simply returns C<1>
728     and does not do anything with the message, but this counts as "message
729     being logged" and might not be very efficient.
730    
731     Example: propagate all messages except for log levels "debug" and
732     "trace". The messages will still be generated, though, which can slow down
733     your program.
734    
735     $ctx->levels ("debug", "trace");
736     $ctx->log_cb (sub { 1 }); # do not log, but eat debug and trace messages
737    
738 root 1.8 =item $ctx->fmt_cb ($fmt_cb->($timestamp, $ctx, $level, $message))
739    
740 root 1.10 Replaces the formatting callback on the context (C<undef> restores the
741 root 1.8 default formatter).
742    
743     The callback is passed the (possibly fractional) timestamp, the original
744     logging context, the (numeric) logging level and the raw message string and needs to
745     return a formatted log message. In most cases this will be a string, but
746     it could just as well be an array reference that just stores the values.
747    
748     Example: format just the raw message, with numeric log level in angle
749     brackets.
750    
751     $ctx->fmt_cb (sub {
752     my ($time, $ctx, $lvl, $msg) = @_;
753    
754     "<$lvl>$msg\n"
755     });
756    
757     Example: return an array reference with just the log values, and use
758     C<PApp::SQL::sql_exec> to store the emssage in a database.
759    
760     $ctx->fmt_cb (sub { \@_ });
761     $ctx->log_cb (sub {
762     my ($msg) = @_;
763    
764     sql_exec "insert into log (when, subsys, prio, msg) values (?, ?, ?, ?)",
765     $msg->[0] + 0,
766     "$msg->[1]",
767     $msg->[2] + 0,
768     "$msg->[3]";
769    
770     0
771     });
772    
773     =cut
774    
775     sub log_cb {
776     my ($ctx, $cb) = @_;
777 root 1.6
778 root 1.10 $ctx->[3] = $cb;
779 root 1.6 }
780 root 1.5
781 root 1.8 sub fmt_cb {
782     my ($ctx, $cb) = @_;
783 root 1.6
784 root 1.8 $ctx->[4] = $cb;
785 root 1.5 }
786    
787 root 1.8 =item $ctx->log ($level, $msg[, @params])
788    
789     Same as C<AnyEvent::Log::log>, but uses the given context as log context.
790    
791     =item $logger = $ctx->logger ($level[, \$enabled])
792    
793     Same as C<AnyEvent::Log::logger>, but uses the given context as log
794     context.
795    
796     =cut
797    
798     *log = \&AnyEvent::Log::_log;
799     *logger = \&AnyEvent::Log::_logger;
800    
801 root 1.1 1;
802    
803     =back
804    
805 root 1.12 =head1 EXAMPLES
806    
807     This section shows some common configurations.
808    
809     =over 4
810    
811     =item Setting the global logging level.
812    
813     Either put PERL_ANYEVENT_VERBOSE=<number> into your environment before
814     running your program, or modify the log level of the root context:
815    
816     PERL_ANYEVENT_VERBOSE=5 ./myprog
817    
818     $AnyEvent::Log::Root->level ("warn");
819    
820     =item Append all messages to a file instead of sending them to STDERR.
821    
822     This is affected by the global logging level.
823    
824     open my $fh, ">>", $path
825     or die "$path: $!";
826    
827     $AnyEvent::Log::Default->log_cb (sub {
828     syswrite $fh, shift;
829     0
830     });
831    
832     =item Write all messages with priority C<error> and higher to a file.
833    
834     This writes them only when the global logging level allows it, because
835     it is attached to the default context which is invoked I<after> global
836     filtering.
837    
838     open my $fh, ">>", $path
839     or die "$path: $!";
840    
841     $AnyEvent::Log::Default->attach (new AnyEvent::Log::Ctx
842     log_cb => sub { syswrite $fh, shift; 0 });
843    
844     This writes them regardless of the global logging level, because it is
845     attached to the toplevel context, which receives all messages I<before>
846     the global filtering.
847    
848     $AnyEvent::Log::Top->attach (new AnyEvent::Log::Ctx
849     log_cb => sub { syswrite $fh, shift; 0 });
850    
851     In both cases, messages are still written to STDOUT.
852    
853     =item Write trace messages (only) from L<AnyEvent::Debug> to the default logging target(s).
854    
855     Attach the CyAnyEvent::Log::Default> context to the C<AnyEvent::Debug>
856     context and increase the C<AnyEvent::Debug> logging level - this simply
857     circumvents the global filtering for trace messages.
858    
859     my $debug = AnyEvent::Debug->AnyEvent::Log::ctx;
860     $debug->attach ($AnyEvent::Log::Default);
861     $debug->levels ("trace"); # not "level"!
862    
863 root 1.13 This of course works for any package.
864    
865 root 1.12 =back
866    
867 root 1.1 =head1 AUTHOR
868    
869     Marc Lehmann <schmorp@schmorp.de>
870     http://home.schmorp.de/
871    
872     =cut