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

# 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 local $SIG{__DIE__};
284 my $die = sub { die };
285
286 for (@_ ? $LOGGER{$_[0]} : values %LOGGER) {
287 my ($ctx, $level, $renabled) = @$_;
288
289 # to detect whether a message would be logged, we actually
290 # try to log one and die. this isn't fast, but we can be
291 # sure that the logging decision is correct :)
292
293 $$renabled = !eval {
294 _log $ctx, $level, $die;
295
296 1
297 };
298 }
299 }
300
301 sub _logger {
302 my ($ctx, $level, $renabled) = @_;
303
304 $$renabled = 1;
305
306 my $logger = [$ctx, $level, $renabled];
307
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 _log $ctx, $level, @_
321 if $$renabled;
322 }
323 }
324
325 sub logger($;$) {
326 _logger
327 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
328 @_
329 }
330
331 =back
332
333 =head1 LOGGING CONTEXTS
334
335 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
339 A logging context has three major responsibilities: filtering, logging and
340 propagating the message.
341
342 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
352 For propagation, a context can have any number of attached I<parent
353 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
357 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 =head2 DEFAULTS
362
363 By default, all logging contexts have an full set of log levels ("all"), a
364 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 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 Perl is C<main>, the default parent of any top-level package context is
374 C<AnyEvent::Log::Top>.
375
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 When the module is loaded it creates the default context called
383 C<AnyEvent::Log::Default> (also stored in C<$AnyEvent::Log::Default>),
384 which simply logs everything via C<warn> and doesn't propagate anything
385 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 it at default config. It's purpose is simply to collect all log messages
399 system-wide.
400
401 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
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 AnyEvent::Log::Default context to be passed to C<warn>.
409
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 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
419 =head2 CREATING/FINDING/DESTROYING CONTEXTS
420
421 =over 4
422
423 =item $ctx = AnyEvent::Log::ctx [$pkg]
424
425 This function creates or returns a logging context (which is an object).
426
427 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
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 : bless [undef, (1 << 10) - 1 - 1], "AnyEvent::Log::Ctx"
445 }
446
447 =item AnyEvent::Log::reset
448
449 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
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 # 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
469 $AnyEvent::Log::Default->parents;
470 $AnyEvent::Log::Default->title ("AnyEvent::Log::Default");
471 $AnyEvent::Log::Default->log_cb (sub {
472 warn shift;
473 0
474 });
475 $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
482 $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 }
488
489 # 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 AnyEvent::Log::reset;
495
496 # hello, CPAN, please catch me
497 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
504 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 =back
530
531 =cut
532
533 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
546
547 =head2 CONFIGURING A LOG CONTEXT
548
549 The following methods can be used to configure the logging context.
550
551 =over 4
552
553 =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 =back
568
569 =head3 LOGGING LEVELS
570
571 The following methods deal with the logging level set associated with the
572 log context.
573
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 All functions which accept a list of levels also accept the special string
578 C<all> which expands to all logging levels.
579
580 =over 4
581
582 =item $ctx->levels ($level[, $level...)
583
584 Enables logging for the given levels and disables it for all others.
585
586 =item $ctx->level ($level)
587
588 Enables logging for the given level and all lower level (higher priority)
589 ones. In addition to normal logging levels, specifying a level of C<0> or
590 C<off> disables all logging for this level.
591
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
601 =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 map {
609 $_ > 0 && $_ <= 9 ? $_+0
610 : $_ eq "all" ? (1 .. 9)
611 : $STR2LEVEL{$_} || Carp::croak "$_: not a valid logging level, caught"
612 } @_
613 }
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 my $lvl = $_[0] =~ /^(?:0|off|none)$/ ? 0 : (_lvl_lst $_[0])[-1];
628
629 $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 =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 =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
673 =item $ctx->parents ($ctx2[, $ctx3...])
674
675 Replaces all parents attached to this context by the ones given.
676
677 =cut
678
679 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 sub parents {
694 undef $_[0][2];
695 &attach;
696 }
697
698 =back
699
700 =head3 MESSAGE LOGGING
701
702 The following methods configure how the logging context actually does
703 the logging (which consists of formatting the message and printing it or
704 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 =item $ctx->log_cb ($cb->($str))
710
711 Replaces the logging callback on the context (C<undef> disables the
712 logging callback).
713
714 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 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 =item $ctx->fmt_cb ($fmt_cb->($timestamp, $ctx, $level, $message))
739
740 Replaces the formatting callback on the context (C<undef> restores the
741 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
778 $ctx->[3] = $cb;
779 }
780
781 sub fmt_cb {
782 my ($ctx, $cb) = @_;
783
784 $ctx->[4] = $cb;
785 }
786
787 =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 1;
802
803 =back
804
805 =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 This of course works for any package.
864
865 =back
866
867 =head1 AUTHOR
868
869 Marc Lehmann <schmorp@schmorp.de>
870 http://home.schmorp.de/
871
872 =cut