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

# Content
1 =head1 NAME
2
3 AnyEvent::Log - simple logging "framework"
4
5 =head1 SYNOPSIS
6
7 # 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 # "complex" use
16 use AnyEvent::Log;
17
18 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 # configuration
24
25 # set logging for this package to errors and higher only
26 AnyEvent::Log::ctx->level ("error");
27
28 # set logging globally to anything below debug
29 $AnyEvent::Log::Root->level ("notice");
30
31 # see also EXAMPLES, below
32
33 =head1 DESCRIPTION
34
35 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 Remember that the default verbosity level is C<0>, so nothing will be
42 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 something like:
45
46 use AnyEvent;
47 (AnyEvent::Log::ctx "")->level ("info");
48
49 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 The amount of documentation might indicate otherwise, but the module is
55 still just 240 lines or so.
56
57 =head1 LOGGING FUNCTIONS
58
59 These functions allow you to log messages. They always use the caller's
60 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
64 =over 4
65
66 =cut
67
68 package AnyEvent::Log;
69
70 use Carp ();
71 use POSIX ();
72
73 use AnyEvent (); BEGIN { AnyEvent::common_sense }
74 use AnyEvent::Util ();
75
76 our $VERSION = $AnyEvent::VERSION;
77
78 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 our %CTX; # all logging contexts
92
93 # creates a default package context object for the given package
94 sub _pkg_ctx($) {
95 my $ctx = bless [$_[0], (1 << 10) - 1 - 1, {}], "AnyEvent::Log::Ctx";
96
97 # link "parent" package
98 my $pkg = $_[0] =~ /^(.+)::/ ? $1 : "AE::Log::Top";
99
100 $pkg = $CTX{$pkg} ||= &_pkg_ctx ($pkg);
101 $ctx->[2]{$pkg+0} = $pkg;
102
103 $ctx
104 }
105
106 =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 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
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 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 Also, if you optionally generate a lot of debug messages (such as when
135 tracing some code), you should look into using a logger callback and a
136 boolean enabler (see C<logger>, below).
137
138 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 =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 sub now () { time }
166
167 AnyEvent::post_detect {
168 *now = \&AE::now;
169 };
170
171 our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace);
172
173 # time, ctx, level, msg
174 sub _format($$$$) {
175 my $ts = ft $_[0];
176 my $ct = " ";
177
178 my @res;
179
180 for (split /\n/, sprintf "%-5s %s: %s", $LEVEL2STR[$_[2]], $_[1][0], $_[3]) {
181 push @res, "$ts$ct$_\n";
182 $ct = " + ";
183 }
184
185 join "", @res
186 }
187
188 sub _log {
189 my ($ctx, $level, $format, @args) = @_;
190
191 $level = $level > 0 && $level <= 9
192 ? $level+0
193 : $STR2LEVEL{$level} || Carp::croak "$level: not a valid logging level, caught";
194
195 my $mask = 1 << $level;
196
197 my (%seen, @ctx, $now, $fmt);
198
199 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 }
226 while $ctx = pop @ctx;
227
228 exit 1 if $level <= 1;
229 }
230
231 sub log($$;@) {
232 _log
233 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
234 @_;
235 }
236
237 *AnyEvent::log = *AE::log = \&log;
238
239 =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 my ($ctx, $level, $renabled) = @$_;
285
286 # 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 # sure that the logging decision is correct :)
289
290 $$renabled = !eval {
291 local $SIG{__DIE__};
292
293 _log $ctx, $level, sub { die };
294
295 1
296 };
297
298 $$renabled = 1; # TODO
299 }
300 }
301
302 sub _logger {
303 my ($ctx, $level, $renabled) = @_;
304
305 $$renabled = 1;
306
307 my $logger = [$ctx, $level, $renabled];
308
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 _log $ctx, $level, @_
322 if $$renabled;
323 }
324 }
325
326 sub logger($;$) {
327 _logger
328 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
329 @_
330 }
331
332 =back
333
334 =head1 LOGGING CONTEXTS
335
336 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
340 A logging context has three major responsibilities: filtering, logging and
341 propagating the message.
342
343 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
353 For propagation, a context can have any number of attached I<parent
354 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
358 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 =head2 DEFAULTS
363
364 By default, all logging contexts have an full set of log levels ("all"), a
365 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 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 Perl is C<main>, the default parent of any top-level package context is
375 C<AnyEvent::Log::Top>.
376
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 When the module is loaded it creates the default context called
384 C<AnyEvent::Log::Default> (also stored in C<$AnyEvent::Log::Default>),
385 which simply logs everything via C<warn> and doesn't propagate anything
386 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 it at default config. It's purpose is simply to collect all log messages
400 system-wide.
401
402 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
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 AnyEvent::Log::Default context to be passed to C<warn>.
410
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 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
420 =head2 CREATING/FINDING/DESTROYING CONTEXTS
421
422 =over 4
423
424 =item $ctx = AnyEvent::Log::ctx [$pkg]
425
426 This function creates or returns a logging context (which is an object).
427
428 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
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 : bless [undef, (1 << 10) - 1 - 1], "AnyEvent::Log::Ctx"
446 }
447
448 =item AnyEvent::Log::reset
449
450 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
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 # 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
470 $AnyEvent::Log::Default->parents;
471 $AnyEvent::Log::Default->title ("AnyEvent::Log::Default");
472 $AnyEvent::Log::Default->log_cb (sub {
473 warn shift;
474 0
475 });
476 $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
483 $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 }
489
490 # 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 AnyEvent::Log::reset;
496
497 # hello, CPAN, please catch me
498 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
505 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 =back
531
532 =cut
533
534 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
547
548 =head2 CONFIGURING A LOG CONTEXT
549
550 The following methods can be used to configure the logging context.
551
552 =over 4
553
554 =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 =back
569
570 =head3 LOGGING LEVELS
571
572 The following methods deal with the logging level set associated with the
573 log context.
574
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 All functions which accept a list of levels also accept the special string
579 C<all> which expands to all logging levels.
580
581 =over 4
582
583 =item $ctx->levels ($level[, $level...)
584
585 Enables logging for the given levels and disables it for all others.
586
587 =item $ctx->level ($level)
588
589 Enables logging for the given level and all lower level (higher priority)
590 ones. In addition to normal logging levels, specifying a level of C<0> or
591 C<off> disables all logging for this level.
592
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
602 =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 map {
610 $_ > 0 && $_ <= 9 ? $_+0
611 : $_ eq "all" ? (1 .. 9)
612 : $STR2LEVEL{$_} || Carp::croak "$_: not a valid logging level, caught"
613 } @_
614 }
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 my $lvl = $_[0] =~ /^(?:0|off|none)$/ ? 0 : (_lvl_lst $_[0])[-1];
629
630 $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 =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 =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
674 =item $ctx->parents ($ctx2[, $ctx3...])
675
676 Replaces all parents attached to this context by the ones given.
677
678 =cut
679
680 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 sub parents {
695 undef $_[0][2];
696 &attach;
697 }
698
699 =back
700
701 =head3 MESSAGE LOGGING
702
703 The following methods configure how the logging context actually does
704 the logging (which consists of formatting the message and printing it or
705 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 =item $ctx->log_cb ($cb->($str))
711
712 Replaces the logging callback on the context (C<undef> disables the
713 logging callback).
714
715 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 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 =item $ctx->fmt_cb ($fmt_cb->($timestamp, $ctx, $level, $message))
740
741 Replaces the formatting callback on the context (C<undef> restores the
742 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
779 $ctx->[3] = $cb;
780 }
781
782 sub fmt_cb {
783 my ($ctx, $cb) = @_;
784
785 $ctx->[4] = $cb;
786 }
787
788 =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 1;
803
804 =back
805
806 =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 This of course works for any package.
865
866 =back
867
868 =head1 AUTHOR
869
870 Marc Lehmann <schmorp@schmorp.de>
871 http://home.schmorp.de/
872
873 =cut