ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Log.pm
Revision: 1.59
Committed: Mon Apr 9 02:25:48 2012 UTC (12 years, 1 month ago) by root
Branch: MAIN
CVS Tags: rel-7_0, rel-7_04, rel-7_01, rel-7_02, rel-7_03
Changes since 1.58: +1 -1 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.25 Simple uses:
8 root 1.24
9 root 1.8 use AnyEvent;
10    
11 root 1.54 AE::log fatal => "No config found, cannot continue!"; # never returns
12     AE::log alert => "The battery died!";
13     AE::log crit => "The battery temperature is too hot!";
14     AE::log error => "Division by zero attempted.";
15     AE::log warn => "Couldn't delete the file.";
16     AE::log note => "Wanted to create config, but config already exists.";
17     AE::log info => "File soandso successfully deleted.";
18 root 1.51 AE::log debug => "the function returned 3";
19 root 1.44 AE::log trace => "going to call function abc";
20 root 1.8
21 root 1.44 Log level overview:
22 root 1.41
23 root 1.44 LVL NAME SYSLOG PERL NOTE
24     1 fatal emerg exit system unusable, aborts program!
25     2 alert failure in primary system
26     3 critical crit failure in backup system
27     4 error err die non-urgent program errors, a bug
28     5 warn warning possible problem, not necessarily error
29     6 note notice unusual conditions
30     7 info normal messages, no action required
31     8 debug debugging messages for development
32     9 trace copious tracing output
33    
34     "Complex" uses (for speed sensitive code, e.g. trace/debug messages):
35 root 1.24
36 root 1.1 use AnyEvent::Log;
37    
38 root 1.8 my $tracer = AnyEvent::Log::logger trace => \$my $trace;
39    
40     $tracer->("i am here") if $trace;
41     $tracer->(sub { "lots of data: " . Dumper $self }) if $trace;
42    
43 root 1.25 Configuration (also look at the EXAMPLES section):
44 root 1.10
45 root 1.18 # set logging for the current package to errors and higher only
46 root 1.16 AnyEvent::Log::ctx->level ("error");
47 root 1.10
48 root 1.23 # set logging level to suppress anything below "notice"
49 root 1.18 $AnyEvent::Log::FILTER->level ("notice");
50 root 1.10
51 root 1.23 # send all critical and higher priority messages to syslog,
52     # regardless of (most) other settings
53     $AnyEvent::Log::COLLECT->attach (new AnyEvent::Log::Ctx
54     level => "critical",
55 root 1.40 log_to_syslog => "user",
56 root 1.23 );
57    
58 root 1.1 =head1 DESCRIPTION
59    
60 root 1.2 This module implements a relatively simple "logging framework". It doesn't
61     attempt to be "the" logging solution or even "a" logging solution for
62     AnyEvent - AnyEvent simply creates logging messages internally, and this
63     module more or less exposes the mechanism, with some extra spiff to allow
64     using it from other modules as well.
65    
66 root 1.51 Remember that the default verbosity level is C<4> (C<error>), so only
67     errors and more important messages will be logged, unless you set
68     C<PERL_ANYEVENT_VERBOSE> to a higher number before starting your program
69     (C<AE_VERBOSE=5> is recommended during development), or change the logging
70     level at runtime with something like:
71 root 1.2
72 root 1.18 use AnyEvent::Log;
73 root 1.34 $AnyEvent::Log::FILTER->level ("info");
74 root 1.2
75 root 1.10 The design goal behind this module was to keep it simple (and small),
76     but make it powerful enough to be potentially useful for any module, and
77     extensive enough for the most common tasks, such as logging to multiple
78     targets, or being able to log into a database.
79    
80 root 1.36 The module is also usable before AnyEvent itself is initialised, in which
81     case some of the functionality might be reduced.
82    
83 root 1.33 The amount of documentation might indicate otherwise, but the runtime part
84     of the module is still just below 300 lines of code.
85 root 1.18
86     =head1 LOGGING LEVELS
87    
88     Logging levels in this module range from C<1> (highest priority) to C<9>
89     (lowest priority). Note that the lowest numerical value is the highest
90     priority, so when this document says "higher priority" it means "lower
91     numerical value".
92    
93     Instead of specifying levels by name you can also specify them by aliases:
94    
95     LVL NAME SYSLOG PERL NOTE
96 root 1.42 1 fatal emerg exit system unusable, aborts program!
97     2 alert failure in primary system
98     3 critical crit failure in backup system
99     4 error err die non-urgent program errors, a bug
100     5 warn warning possible problem, not necessarily error
101     6 note notice unusual conditions
102     7 info normal messages, no action required
103     8 debug debugging messages for development
104     9 trace copious tracing output
105 root 1.18
106     As you can see, some logging levels have multiple aliases - the first one
107     is the "official" name, the second one the "syslog" name (if it differs)
108 root 1.41 and the third one the "perl" name, suggesting (only!) that you log C<die>
109 root 1.42 messages at C<error> priority. The NOTE column tries to provide some
110     rationale on how to chose a logging level.
111    
112 root 1.48 As a rough guideline, levels 1..3 are primarily meant for users of the
113     program (admins, staff), and are the only ones logged to STDERR by
114 root 1.42 default. Levels 4..6 are meant for users and developers alike, while
115     levels 7..9 are usually meant for developers.
116 root 1.18
117 root 1.48 You can normally only log a message once at highest priority level (C<1>,
118     C<fatal>), because logging a fatal message will also quit the program - so
119     use it sparingly :)
120 root 1.18
121 root 1.51 For example, a program that finds an unknown switch on the commandline
122     might well use a fatal logging level to tell users about it - the "system"
123     in this case would be the program, or module.
124    
125 root 1.18 Some methods also offer some extra levels, such as C<0>, C<off>, C<none>
126 root 1.48 or C<all> - these are only valid for the methods that documented them.
127 root 1.14
128 root 1.9 =head1 LOGGING FUNCTIONS
129 root 1.2
130 root 1.48 The following functions allow you to log messages. They always use the
131     caller's package as a "logging context". Also, the main logging function,
132     C<log>, is aliased to C<AnyEvent::log> and C<AE::log> when the C<AnyEvent>
133     module is loaded.
134 root 1.1
135     =over 4
136    
137     =cut
138    
139     package AnyEvent::Log;
140    
141 root 1.2 use Carp ();
142 root 1.1 use POSIX ();
143    
144 root 1.45 # layout of a context
145     # 0 1 2 3 4, 5
146     # [$title, $level, %$slaves, &$logcb, &$fmtcb, $cap]
147    
148 root 1.1 use AnyEvent (); BEGIN { AnyEvent::common_sense }
149 root 1.37 #use AnyEvent::Util (); need to load this in a delayed fashion, as it uses AE::log
150 root 1.1
151 root 1.14 our $VERSION = $AnyEvent::VERSION;
152    
153 root 1.18 our ($COLLECT, $FILTER, $LOG);
154    
155 root 1.2 our ($now_int, $now_str1, $now_str2);
156    
157     # Format Time, not public - yet?
158     sub ft($) {
159     my $i = int $_[0];
160     my $f = sprintf "%06d", 1e6 * ($_[0] - $i);
161    
162     ($now_int, $now_str1, $now_str2) = ($i, split /\x01/, POSIX::strftime "%Y-%m-%d %H:%M:%S.\x01 %z", localtime $i)
163     if $now_int != $i;
164    
165     "$now_str1$f$now_str2"
166     }
167    
168 root 1.18 our %CTX; # all package contexts
169 root 1.3
170 root 1.8 # creates a default package context object for the given package
171     sub _pkg_ctx($) {
172 root 1.10 my $ctx = bless [$_[0], (1 << 10) - 1 - 1, {}], "AnyEvent::Log::Ctx";
173 root 1.8
174     # link "parent" package
175 root 1.18 my $parent = $_[0] =~ /^(.+)::/
176     ? $CTX{$1} ||= &_pkg_ctx ("$1")
177     : $COLLECT;
178 root 1.8
179 root 1.18 $ctx->[2]{$parent+0} = $parent;
180 root 1.8
181     $ctx
182     }
183    
184 root 1.2 =item AnyEvent::Log::log $level, $msg[, @args]
185    
186 root 1.22 Requests logging of the given C<$msg> with the given log level, and
187     returns true if the message was logged I<somewhere>.
188 root 1.2
189 root 1.41 For loglevel C<fatal>, the program will abort.
190 root 1.2
191     If only a C<$msg> is given, it is logged as-is. With extra C<@args>, the
192     C<$msg> is interpreted as an sprintf format string.
193    
194     The C<$msg> should not end with C<\n>, but may if that is convenient for
195     you. Also, multiline messages are handled properly.
196    
197 root 1.3 Last not least, C<$msg> might be a code reference, in which case it is
198     supposed to return the message. It will be called only then the message
199     actually gets logged, which is useful if it is costly to create the
200     message in the first place.
201 root 1.2
202 root 1.46 This function takes care of saving and restoring C<$!> and C<$@>, so you
203     don't have to.
204    
205 root 1.2 Whether the given message will be logged depends on the maximum log level
206 root 1.22 and the caller's package. The return value can be used to ensure that
207     messages or not "lost" - for example, when L<AnyEvent::Debug> detects a
208     runtime error it tries to log it at C<die> level, but if that message is
209     lost it simply uses warn.
210 root 1.2
211     Note that you can (and should) call this function as C<AnyEvent::log> or
212 root 1.8 C<AE::log>, without C<use>-ing this module if possible (i.e. you don't
213     need any additional functionality), as those functions will load the
214     logging module on demand only. They are also much shorter to write.
215    
216 root 1.11 Also, if you optionally generate a lot of debug messages (such as when
217 root 1.8 tracing some code), you should look into using a logger callback and a
218     boolean enabler (see C<logger>, below).
219 root 1.2
220 root 1.3 Example: log something at error level.
221    
222     AE::log error => "something";
223    
224     Example: use printf-formatting.
225    
226     AE::log info => "%5d %-10.10s %s", $index, $category, $msg;
227    
228     Example: only generate a costly dump when the message is actually being logged.
229    
230     AE::log debug => sub { require Data::Dump; Data::Dump::dump \%cache };
231    
232 root 1.2 =cut
233    
234     # also allow syslog equivalent names
235     our %STR2LEVEL = (
236 root 1.18 fatal => 1, emerg => 1, exit => 1,
237 root 1.2 alert => 2,
238     critical => 3, crit => 3,
239 root 1.18 error => 4, err => 4, die => 4,
240 root 1.2 warn => 5, warning => 5,
241     note => 6, notice => 6,
242     info => 7,
243     debug => 8,
244     trace => 9,
245     );
246    
247 root 1.38 our $TIME_EXACT;
248    
249     sub exact_time($) {
250     $TIME_EXACT = shift;
251     *_ts = $AnyEvent::MODEL
252     ? $TIME_EXACT ? \&AE::now : \&AE::time
253     : sub () { $TIME_EXACT ? do { require Time::HiRes; Time::HiRes::time () } : time };
254     }
255    
256     BEGIN {
257     exact_time 0;
258     }
259 root 1.10
260 root 1.4 AnyEvent::post_detect {
261 root 1.38 exact_time $TIME_EXACT;
262 root 1.4 };
263    
264 root 1.2 our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace);
265    
266 root 1.8 # time, ctx, level, msg
267     sub _format($$$$) {
268 root 1.11 my $ts = ft $_[0];
269     my $ct = " ";
270    
271 root 1.10 my @res;
272 root 1.8
273 root 1.10 for (split /\n/, sprintf "%-5s %s: %s", $LEVEL2STR[$_[2]], $_[1][0], $_[3]) {
274 root 1.11 push @res, "$ts$ct$_\n";
275     $ct = " + ";
276 root 1.10 }
277    
278     join "", @res
279 root 1.8 }
280    
281 root 1.43 sub fatal_exit() {
282     exit 1;
283     }
284    
285 root 1.3 sub _log {
286 root 1.8 my ($ctx, $level, $format, @args) = @_;
287 root 1.2
288 root 1.11 $level = $level > 0 && $level <= 9
289     ? $level+0
290     : $STR2LEVEL{$level} || Carp::croak "$level: not a valid logging level, caught";
291 root 1.2
292 root 1.8 my $mask = 1 << $level;
293 root 1.2
294 root 1.45 my ($success, %seen, @ctx, $now, @fmt);
295 root 1.8
296 root 1.11 do
297     {
298 root 1.45 # if !ref, then it's a level number
299     if (!ref $ctx) {
300     $level = $ctx;
301     } elsif ($ctx->[1] & $mask and !$seen{$ctx+0}++) {
302     # logging/recursing into this context
303    
304     # level cap
305     if ($ctx->[5] > $level) {
306     push @ctx, $level; # restore level when going up in tree
307     $level = $ctx->[5];
308     }
309    
310     # log if log cb
311 root 1.11 if ($ctx->[3]) {
312     # logging target found
313    
314 root 1.46 local ($!, $@);
315    
316 root 1.11 # now get raw message, unless we have it already
317     unless ($now) {
318     $format = $format->() if ref $format;
319     $format = sprintf $format, @args if @args;
320     $format =~ s/\n$//;
321 root 1.38 $now = _ts;
322 root 1.11 };
323    
324     # format msg
325     my $str = $ctx->[4]
326     ? $ctx->[4]($now, $_[0], $level, $format)
327 root 1.45 : ($fmt[$level] ||= _format $now, $_[0], $level, $format);
328 root 1.11
329 root 1.22 $success = 1;
330    
331 root 1.21 $ctx->[3]($str)
332 root 1.18 or push @ctx, values %{ $ctx->[2] }; # not consumed - propagate
333     } else {
334     push @ctx, values %{ $ctx->[2] }; # not masked - propagate
335 root 1.11 }
336     }
337 root 1.8 }
338 root 1.11 while $ctx = pop @ctx;
339 root 1.2
340 root 1.43 fatal_exit if $level <= 1;
341 root 1.22
342     $success
343 root 1.2 }
344    
345 root 1.3 sub log($$;@) {
346 root 1.8 _log
347     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
348     @_;
349 root 1.3 }
350    
351     =item $logger = AnyEvent::Log::logger $level[, \$enabled]
352    
353     Creates a code reference that, when called, acts as if the
354 root 1.22 C<AnyEvent::Log::log> function was called at this point with the given
355 root 1.3 level. C<$logger> is passed a C<$msg> and optional C<@args>, just as with
356     the C<AnyEvent::Log::log> function:
357    
358     my $debug_log = AnyEvent::Log::logger "debug";
359    
360     $debug_log->("debug here");
361     $debug_log->("%06d emails processed", 12345);
362     $debug_log->(sub { $obj->as_string });
363    
364     The idea behind this function is to decide whether to log before actually
365     logging - when the C<logger> function is called once, but the returned
366     logger callback often, then this can be a tremendous speed win.
367    
368     Despite this speed advantage, changes in logging configuration will
369     still be reflected by the logger callback, even if configuration changes
370     I<after> it was created.
371    
372     To further speed up logging, you can bind a scalar variable to the logger,
373     which contains true if the logger should be called or not - if it is
374     false, calling the logger can be safely skipped. This variable will be
375     updated as long as C<$logger> is alive.
376    
377     Full example:
378    
379     # near the init section
380     use AnyEvent::Log;
381    
382     my $debug_log = AnyEvent:Log::logger debug => \my $debug;
383    
384     # and later in your program
385     $debug_log->("yo, stuff here") if $debug;
386    
387     $debug and $debug_log->("123");
388    
389     =cut
390    
391     our %LOGGER;
392    
393     # re-assess logging status for all loggers
394     sub _reassess {
395 root 1.17 local $SIG{__DIE__};
396     my $die = sub { die };
397    
398 root 1.3 for (@_ ? $LOGGER{$_[0]} : values %LOGGER) {
399 root 1.8 my ($ctx, $level, $renabled) = @$_;
400 root 1.3
401 root 1.17 # to detect whether a message would be logged, we actually
402 root 1.11 # try to log one and die. this isn't fast, but we can be
403 root 1.3 # sure that the logging decision is correct :)
404    
405     $$renabled = !eval {
406 root 1.17 _log $ctx, $level, $die;
407 root 1.3
408     1
409     };
410     }
411     }
412    
413 root 1.15 sub _logger {
414 root 1.8 my ($ctx, $level, $renabled) = @_;
415 root 1.3
416     $$renabled = 1;
417    
418 root 1.8 my $logger = [$ctx, $level, $renabled];
419 root 1.3
420     $LOGGER{$logger+0} = $logger;
421    
422     _reassess $logger+0;
423    
424 root 1.43 require AnyEvent::Util unless $AnyEvent::Util::VERSION;
425 root 1.37 my $guard = AnyEvent::Util::guard (sub {
426 root 1.3 # "clean up"
427     delete $LOGGER{$logger+0};
428 root 1.37 });
429 root 1.3
430     sub {
431     $guard if 0; # keep guard alive, but don't cause runtime overhead
432    
433 root 1.8 _log $ctx, $level, @_
434 root 1.3 if $$renabled;
435     }
436     }
437    
438 root 1.8 sub logger($;$) {
439     _logger
440     $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
441     @_
442     }
443    
444 root 1.38 =item AnyEvent::Log::exact_time $on
445    
446     By default, C<AnyEvent::Log> will use C<AE::now>, i.e. the cached
447     eventloop time, for the log timestamps. After calling this function with a
448     true value it will instead resort to C<AE::time>, i.e. fetch the current
449     time on each log message. This only makes a difference for event loops
450     that actually cache the time (such as L<EV> or L<AnyEvent::Loop>).
451    
452 root 1.39 This setting can be changed at any time by calling this function.
453    
454 root 1.38 Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been
455     initialised, this switch will also decide whether to use C<CORE::time> or
456     C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes
457     available.
458    
459 root 1.2 =back
460    
461 root 1.9 =head1 LOGGING CONTEXTS
462 root 1.2
463 root 1.9 This module associates every log message with a so-called I<logging
464     context>, based on the package of the caller. Every perl package has its
465     own logging context.
466 root 1.8
467 root 1.10 A logging context has three major responsibilities: filtering, logging and
468     propagating the message.
469 root 1.9
470 root 1.10 For the first purpose, filtering, each context has a set of logging
471     levels, called the log level mask. Messages not in the set will be ignored
472     by this context (masked).
473    
474     For logging, the context stores a formatting callback (which takes the
475     timestamp, context, level and string message and formats it in the way
476     it should be logged) and a logging callback (which is responsible for
477     actually logging the formatted message and telling C<AnyEvent::Log>
478     whether it has consumed the message, or whether it should be propagated).
479 root 1.9
480 root 1.18 For propagation, a context can have any number of attached I<slave
481 root 1.10 contexts>. Any message that is neither masked by the logging mask nor
482 root 1.18 masked by the logging callback returning true will be passed to all slave
483 root 1.10 contexts.
484 root 1.9
485 root 1.11 Each call to a logging function will log the message at most once per
486     context, so it does not matter (much) if there are cycles or if the
487     message can arrive at the same context via multiple paths.
488    
489 root 1.9 =head2 DEFAULTS
490    
491 root 1.10 By default, all logging contexts have an full set of log levels ("all"), a
492 root 1.9 disabled logging callback and the default formatting callback.
493    
494     Package contexts have the package name as logging title by default.
495    
496 root 1.18 They have exactly one slave - the context of the "parent" package. The
497 root 1.9 parent package is simply defined to be the package name without the last
498     component, i.e. C<AnyEvent::Debug::Wrapped> becomes C<AnyEvent::Debug>,
499 root 1.18 and C<AnyEvent> becomes ... C<$AnyEvent::Log::COLLECT> which is the
500     exception of the rule - just like the "parent" of any single-component
501     package name in Perl is C<main>, the default slave of any top-level
502     package context is C<$AnyEvent::Log::COLLECT>.
503 root 1.9
504 root 1.18 Since perl packages form only an approximate hierarchy, this slave
505 root 1.9 context can of course be removed.
506    
507 root 1.18 All other (anonymous) contexts have no slaves and an empty title by
508 root 1.9 default.
509    
510 root 1.18 When the module is loaded it creates the C<$AnyEvent::Log::LOG> logging
511     context that simply logs everything via C<warn>, without propagating
512     anything anywhere by default. The purpose of this context is to provide
513 root 1.12 a convenient place to override the global logging target or to attach
514     additional log targets. It's not meant for filtering.
515    
516 root 1.18 It then creates the C<$AnyEvent::Log::FILTER> context whose
517     purpose is to suppress all messages with priority higher
518     than C<$ENV{PERL_ANYEVENT_VERBOSE}>. It then attached the
519     C<$AnyEvent::Log::LOG> context to it. The purpose of the filter context
520     is to simply provide filtering according to some global log level.
521    
522     Finally it creates the top-level package context C<$AnyEvent::Log::COLLECT>
523     and attaches the C<$AnyEvent::Log::FILTER> context to it, but otherwise
524     leaves it at default config. Its purpose is simply to collect all log
525     messages system-wide.
526    
527     The hierarchy is then:
528    
529     any package, eventually -> $COLLECT -> $FILTER -> $LOG
530    
531     The effect of all this is that log messages, by default, wander up to the
532     C<$AnyEvent::Log::COLLECT> context where all messages normally end up,
533     from there to C<$AnyEvent::Log::FILTER> where log messages with lower
534     priority then C<$ENV{PERL_ANYEVENT_VERBOSE}> will be filtered out and then
535     to the C<$AnyEvent::Log::LOG> context to be passed to C<warn>.
536    
537     This makes it easy to set a global logging level (by modifying $FILTER),
538     but still allow other contexts to send, for example, their debug and trace
539     messages to the $LOG target despite the global logging level, or to attach
540     additional log targets that log messages, regardless of the global logging
541     level.
542    
543     It also makes it easy to modify the default warn-logger ($LOG) to
544     something that logs to a file, or to attach additional logging targets
545     (such as loggign to a file) by attaching it to $FILTER.
546 root 1.9
547 root 1.11 =head2 CREATING/FINDING/DESTROYING CONTEXTS
548 root 1.2
549     =over 4
550    
551 root 1.8 =item $ctx = AnyEvent::Log::ctx [$pkg]
552    
553 root 1.9 This function creates or returns a logging context (which is an object).
554 root 1.8
555 root 1.9 If a package name is given, then the context for that packlage is
556     returned. If it is called without any arguments, then the context for the
557     callers package is returned (i.e. the same context as a C<AE::log> call
558     would use).
559 root 1.8
560     If C<undef> is given, then it creates a new anonymous context that is not
561     tied to any package and is destroyed when no longer referenced.
562    
563     =cut
564    
565     sub ctx(;$) {
566     my $pkg = @_ ? shift : (caller)[0];
567    
568     ref $pkg
569     ? $pkg
570     : defined $pkg
571     ? $CTX{$pkg} ||= AnyEvent::Log::_pkg_ctx $pkg
572 root 1.10 : bless [undef, (1 << 10) - 1 - 1], "AnyEvent::Log::Ctx"
573 root 1.8 }
574    
575 root 1.11 =item AnyEvent::Log::reset
576    
577 root 1.16 Resets all package contexts and recreates the default hierarchy if
578     necessary, i.e. resets the logging subsystem to defaults, as much as
579     possible. This process keeps references to contexts held by other parts of
580     the program intact.
581 root 1.11
582     This can be used to implement config-file (re-)loading: before loading a
583     configuration, reset all contexts.
584    
585     =cut
586    
587 root 1.43 our $ORIG_VERBOSE = $AnyEvent::VERBOSE;
588     $AnyEvent::VERBOSE = 9;
589    
590 root 1.11 sub reset {
591 root 1.15 # hard to kill complex data structures
592 root 1.19 # we "recreate" all package loggers and reset the hierarchy
593 root 1.15 while (my ($k, $v) = each %CTX) {
594     @$v = ($k, (1 << 10) - 1 - 1, { });
595    
596 root 1.19 $v->attach ($k =~ /^(.+)::/ ? $CTX{$1} : $AnyEvent::Log::COLLECT);
597 root 1.15 }
598 root 1.11
599 root 1.19 @$_ = ($_->[0], (1 << 10) - 1 - 1)
600     for $LOG, $FILTER, $COLLECT;
601    
602 root 1.35 #$LOG->slaves;
603 root 1.18 $LOG->title ('$AnyEvent::Log::LOG');
604 root 1.27 $LOG->log_to_warn;
605 root 1.15
606 root 1.18 $FILTER->slaves ($LOG);
607     $FILTER->title ('$AnyEvent::Log::FILTER');
608 root 1.43 $FILTER->level ($ORIG_VERBOSE);
609 root 1.18
610     $COLLECT->slaves ($FILTER);
611 root 1.19 $COLLECT->title ('$AnyEvent::Log::COLLECT');
612 root 1.15
613     _reassess;
614 root 1.11 }
615    
616 root 1.43 # override AE::log/logger
617     *AnyEvent::log = *AE::log = \&log;
618     *AnyEvent::logger = *AE::logger = \&logger;
619    
620     # convert AnyEvent loggers to AnyEvent::Log loggers
621     $_->[0] = ctx $_->[0] # convert "pkg" to "ctx"
622     for values %LOGGER;
623    
624 root 1.15 # create the default logger contexts
625 root 1.18 $LOG = ctx undef;
626     $FILTER = ctx undef;
627     $COLLECT = ctx undef;
628 root 1.15
629 root 1.11 AnyEvent::Log::reset;
630    
631 root 1.12 # hello, CPAN, please catch me
632 root 1.18 package AnyEvent::Log::LOG;
633     package AE::Log::LOG;
634     package AnyEvent::Log::FILTER;
635     package AE::Log::FILTER;
636     package AnyEvent::Log::COLLECT;
637     package AE::Log::COLLECT;
638 root 1.8
639 root 1.12 package AnyEvent::Log::Ctx;
640    
641     =item $ctx = new AnyEvent::Log::Ctx methodname => param...
642    
643     This is a convenience constructor that makes it simpler to construct
644     anonymous logging contexts.
645    
646     Each key-value pair results in an invocation of the method of the same
647     name as the key with the value as parameter, unless the value is an
648     arrayref, in which case it calls the method with the contents of the
649     array. The methods are called in the same order as specified.
650    
651     Example: create a new logging context and set both the default logging
652 root 1.18 level, some slave contexts and a logging callback.
653 root 1.12
654     $ctx = new AnyEvent::Log::Ctx
655     title => "dubious messages",
656     level => "error",
657     log_cb => sub { print STDOUT shift; 0 },
658 root 1.18 slaves => [$ctx1, $ctx, $ctx2],
659 root 1.12 ;
660    
661 root 1.9 =back
662    
663     =cut
664    
665 root 1.12 sub new {
666     my $class = shift;
667    
668     my $ctx = AnyEvent::Log::ctx undef;
669    
670     while (@_) {
671     my ($k, $v) = splice @_, 0, 2;
672     $ctx->$k (ref $v eq "ARRAY" ? @$v : $v);
673     }
674    
675     bless $ctx, $class # do we really support subclassing, hmm?
676     }
677 root 1.8
678    
679 root 1.9 =head2 CONFIGURING A LOG CONTEXT
680    
681     The following methods can be used to configure the logging context.
682    
683     =over 4
684    
685 root 1.8 =item $ctx->title ([$new_title])
686    
687     Returns the title of the logging context - this is the package name, for
688     package contexts, and a user defined string for all others.
689    
690     If C<$new_title> is given, then it replaces the package name or title.
691    
692     =cut
693    
694     sub title {
695     $_[0][0] = $_[1] if @_ > 1;
696     $_[0][0]
697     }
698    
699 root 1.9 =back
700    
701     =head3 LOGGING LEVELS
702    
703 root 1.10 The following methods deal with the logging level set associated with the
704     log context.
705 root 1.9
706     The most common method to use is probably C<< $ctx->level ($level) >>,
707     which configures the specified and any higher priority levels.
708    
709 root 1.10 All functions which accept a list of levels also accept the special string
710     C<all> which expands to all logging levels.
711    
712 root 1.9 =over 4
713    
714 root 1.8 =item $ctx->levels ($level[, $level...)
715    
716 root 1.10 Enables logging for the given levels and disables it for all others.
717 root 1.8
718     =item $ctx->level ($level)
719    
720     Enables logging for the given level and all lower level (higher priority)
721 root 1.10 ones. In addition to normal logging levels, specifying a level of C<0> or
722     C<off> disables all logging for this level.
723 root 1.8
724     Example: log warnings, errors and higher priority messages.
725    
726     $ctx->level ("warn");
727     $ctx->level (5); # same thing, just numeric
728    
729     =item $ctx->enable ($level[, $level...])
730    
731     Enables logging for the given levels, leaving all others unchanged.
732 root 1.5
733 root 1.8 =item $ctx->disable ($level[, $level...])
734    
735     Disables logging for the given levels, leaving all others unchanged.
736    
737 root 1.45 =item $ctx->cap ($level)
738    
739     Caps the maximum priority to the given level, for all messages logged
740     to, or passing through, this context. That is, while this doesn't affect
741     whether a message is logged or passed on, the maximum priority of messages
742     will be limited to the specified level - messages with a higher priority
743     will be set to the specified priority.
744    
745     Another way to view this is that C<< ->level >> filters out messages with
746     a too low priority, while C<< ->cap >> modifies messages with a too high
747     priority.
748    
749     This is useful when different log targets have different interpretations
750     of priority. For example, for a specific command line program, a wrong
751     command line switch might well result in a C<fatal> log message, while the
752     same message, logged to syslog, is likely I<not> fatal to the system or
753     syslog facility as a whole, but more likely a mere C<error>.
754    
755     This can be modeled by having a stderr logger that logs messages "as-is"
756     and a syslog logger that logs messages with a level cap of, say, C<error>,
757     or, for truly system-critical components, actually C<critical>.
758    
759 root 1.8 =cut
760    
761     sub _lvl_lst {
762 root 1.10 map {
763     $_ > 0 && $_ <= 9 ? $_+0
764     : $_ eq "all" ? (1 .. 9)
765     : $STR2LEVEL{$_} || Carp::croak "$_: not a valid logging level, caught"
766     } @_
767 root 1.8 }
768    
769 root 1.45 sub _lvl {
770     $_[0] =~ /^(?:0|off|none)$/ ? 0 : (_lvl_lst $_[0])[-1]
771     }
772    
773 root 1.8 our $NOP_CB = sub { 0 };
774    
775     sub levels {
776     my $ctx = shift;
777     $ctx->[1] = 0;
778     $ctx->[1] |= 1 << $_
779     for &_lvl_lst;
780     AnyEvent::Log::_reassess;
781     }
782    
783     sub level {
784     my $ctx = shift;
785 root 1.45 $ctx->[1] = ((1 << &_lvl) - 1) << 1;
786 root 1.8 AnyEvent::Log::_reassess;
787     }
788    
789     sub enable {
790     my $ctx = shift;
791     $ctx->[1] |= 1 << $_
792     for &_lvl_lst;
793     AnyEvent::Log::_reassess;
794     }
795    
796     sub disable {
797     my $ctx = shift;
798     $ctx->[1] &= ~(1 << $_)
799     for &_lvl_lst;
800     AnyEvent::Log::_reassess;
801     }
802    
803 root 1.45 sub cap {
804     my $ctx = shift;
805     $ctx->[5] = &_lvl;
806     }
807    
808 root 1.9 =back
809    
810 root 1.18 =head3 SLAVE CONTEXTS
811 root 1.9
812     The following methods attach and detach another logging context to a
813     logging context.
814    
815 root 1.18 Log messages are propagated to all slave contexts, unless the logging
816 root 1.9 callback consumes the message.
817    
818     =over 4
819    
820 root 1.8 =item $ctx->attach ($ctx2[, $ctx3...])
821    
822 root 1.18 Attaches the given contexts as slaves to this context. It is not an error
823 root 1.8 to add a context twice (the second add will be ignored).
824    
825     A context can be specified either as package name or as a context object.
826    
827     =item $ctx->detach ($ctx2[, $ctx3...])
828    
829 root 1.18 Removes the given slaves from this context - it's not an error to attempt
830 root 1.8 to remove a context that hasn't been added.
831    
832     A context can be specified either as package name or as a context object.
833 root 1.5
834 root 1.18 =item $ctx->slaves ($ctx2[, $ctx3...])
835 root 1.11
836 root 1.18 Replaces all slaves attached to this context by the ones given.
837 root 1.11
838 root 1.2 =cut
839    
840 root 1.8 sub attach {
841     my $ctx = shift;
842    
843     $ctx->[2]{$_+0} = $_
844     for map { AnyEvent::Log::ctx $_ } @_;
845     }
846    
847     sub detach {
848     my $ctx = shift;
849    
850     delete $ctx->[2]{$_+0}
851     for map { AnyEvent::Log::ctx $_ } @_;
852     }
853    
854 root 1.18 sub slaves {
855 root 1.11 undef $_[0][2];
856     &attach;
857     }
858    
859 root 1.9 =back
860    
861 root 1.18 =head3 LOG TARGETS
862 root 1.9
863     The following methods configure how the logging context actually does
864 root 1.10 the logging (which consists of formatting the message and printing it or
865 root 1.18 whatever it wants to do with it).
866 root 1.9
867     =over 4
868    
869 root 1.55 =item $ctx->log_cb ($cb->($str))
870 root 1.5
871 root 1.8 Replaces the logging callback on the context (C<undef> disables the
872     logging callback).
873 root 1.5
874 root 1.8 The logging callback is responsible for handling formatted log messages
875     (see C<fmt_cb> below) - normally simple text strings that end with a
876 root 1.21 newline (and are possibly multiline themselves).
877 root 1.8
878     It also has to return true iff it has consumed the log message, and false
879     if it hasn't. Consuming a message means that it will not be sent to any
880 root 1.18 slave context. When in doubt, return C<0> from your logging callback.
881 root 1.8
882     Example: a very simple logging callback, simply dump the message to STDOUT
883     and do not consume it.
884    
885     $ctx->log_cb (sub { print STDERR shift; 0 });
886    
887 root 1.10 You can filter messages by having a log callback that simply returns C<1>
888     and does not do anything with the message, but this counts as "message
889     being logged" and might not be very efficient.
890    
891     Example: propagate all messages except for log levels "debug" and
892     "trace". The messages will still be generated, though, which can slow down
893     your program.
894    
895     $ctx->levels ("debug", "trace");
896     $ctx->log_cb (sub { 1 }); # do not log, but eat debug and trace messages
897    
898 root 1.20 =item $ctx->fmt_cb ($fmt_cb->($timestamp, $orig_ctx, $level, $message))
899 root 1.8
900 root 1.10 Replaces the formatting callback on the context (C<undef> restores the
901 root 1.8 default formatter).
902    
903     The callback is passed the (possibly fractional) timestamp, the original
904 root 1.50 logging context (object, not title), the (numeric) logging level and
905     the raw message string and needs to return a formatted log message. In
906     most cases this will be a string, but it could just as well be an array
907     reference that just stores the values.
908 root 1.18
909 root 1.49 If, for some reason, you want to use C<caller> to find out more about the
910 root 1.18 logger then you should walk up the call stack until you are no longer
911     inside the C<AnyEvent::Log> package.
912 root 1.8
913     Example: format just the raw message, with numeric log level in angle
914     brackets.
915    
916     $ctx->fmt_cb (sub {
917     my ($time, $ctx, $lvl, $msg) = @_;
918    
919     "<$lvl>$msg\n"
920     });
921    
922     Example: return an array reference with just the log values, and use
923 root 1.50 C<PApp::SQL::sql_exec> to store the message in a database.
924 root 1.8
925     $ctx->fmt_cb (sub { \@_ });
926     $ctx->log_cb (sub {
927     my ($msg) = @_;
928    
929     sql_exec "insert into log (when, subsys, prio, msg) values (?, ?, ?, ?)",
930     $msg->[0] + 0,
931     "$msg->[1]",
932     $msg->[2] + 0,
933     "$msg->[3]";
934    
935     0
936     });
937    
938 root 1.27 =item $ctx->log_to_warn
939    
940     Sets the C<log_cb> to simply use C<CORE::warn> to report any messages
941     (usually this logs to STDERR).
942    
943 root 1.21 =item $ctx->log_to_file ($path)
944    
945 root 1.55 Sets the C<log_cb> to log to a file (by appending), unbuffered. The
946     function might return before the log file has been opened or created.
947 root 1.21
948     =item $ctx->log_to_path ($path)
949    
950     Same as C<< ->log_to_file >>, but opens the file for each message. This
951     is much slower, but allows you to change/move/rename/delete the file at
952     basically any time.
953    
954 root 1.27 Needless(?) to say, if you do not want to be bitten by some evil person
955     calling C<chdir>, the path should be absolute. Doesn't help with
956     C<chroot>, but hey...
957    
958 root 1.40 =item $ctx->log_to_syslog ([$facility])
959 root 1.21
960 root 1.40 Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and
961     all the others in the obvious way. If specified, then the C<$facility> is
962     used as the facility (C<user>, C<auth>, C<local0> and so on). The default
963     facility is C<user>.
964 root 1.21
965     Note that this function also sets a C<fmt_cb> - the logging part requires
966     an array reference with [$level, $str] as input.
967    
968 root 1.8 =cut
969    
970     sub log_cb {
971     my ($ctx, $cb) = @_;
972 root 1.6
973 root 1.10 $ctx->[3] = $cb;
974 root 1.6 }
975 root 1.5
976 root 1.8 sub fmt_cb {
977     my ($ctx, $cb) = @_;
978 root 1.6
979 root 1.8 $ctx->[4] = $cb;
980 root 1.5 }
981    
982 root 1.27 sub log_to_warn {
983     my ($ctx, $path) = @_;
984    
985     $ctx->log_cb (sub {
986     warn shift;
987     0
988     });
989     }
990    
991 root 1.55 # this function is a good example of why threads are a must,
992     # simply for priority inversion.
993     sub _log_to_disk {
994     # eval'uating this at runtime saves 220kb rss - perl has become
995     # an insane memory waster.
996     eval q{ # poor man's autoloading {}
997     sub _log_to_disk {
998     my ($ctx, $path, $keepopen) = @_;
999    
1000     my $fh;
1001     my @queue;
1002     my $delay;
1003     my $disable;
1004    
1005     use AnyEvent::IO ();
1006    
1007     my $kick = sub {
1008     undef $delay;
1009     return unless @queue;
1010     $delay = 1;
1011    
1012     # we pass $kick to $kick, so $kick itself doesn't keep a reference to $kick.
1013     my $kick = shift;
1014    
1015     # write one or more messages
1016     my $write = sub {
1017     # we write as many messages as have been queued
1018     my $data = join "", @queue;
1019     @queue = ();
1020    
1021 root 1.57 AnyEvent::IO::aio_write $fh, $data, sub {
1022 root 1.55 $disable = 1;
1023     @_
1024     ? ($_[0] == length $data or AE::log 4 => "unable to write to logfile '$path': short write")
1025     : AE::log 4 => "unable to write to logfile '$path': $!";
1026     undef $disable;
1027    
1028     if ($keepopen) {
1029     $kick->($kick);
1030     } else {
1031 root 1.57 AnyEvent::IO::aio_close ($fh, sub {
1032 root 1.55 undef $fh;
1033     $kick->($kick);
1034     });
1035     }
1036     };
1037     };
1038    
1039     if ($fh) {
1040     $write->();
1041     } else {
1042 root 1.57 AnyEvent::IO::aio_open
1043 root 1.55 $path,
1044     AnyEvent::IO::O_CREAT | AnyEvent::IO::O_WRONLY | AnyEvent::IO::O_APPEND,
1045     0666,
1046     sub {
1047     $fh = shift
1048     or do {
1049     $disable = 1;
1050     AE::log 4 => "unable to open logfile '$path': $!";
1051     undef $disable;
1052     return;
1053     };
1054    
1055     $write->();
1056     }
1057     ;
1058     }
1059     };
1060    
1061     $ctx->log_cb (sub {
1062     return if $disable;
1063     push @queue, shift;
1064     $kick->($kick) unless $delay;
1065     0
1066     });
1067    
1068     $kick->($kick) if $keepopen; # initial open
1069     };
1070     };
1071     die if $@;
1072     &_log_to_disk
1073     }
1074    
1075 root 1.18 sub log_to_file {
1076     my ($ctx, $path) = @_;
1077    
1078 root 1.55 _log_to_disk $ctx, $path, 1;
1079 root 1.18 }
1080    
1081 root 1.27 sub log_to_path {
1082 root 1.18 my ($ctx, $path) = @_;
1083    
1084 root 1.55 _log_to_disk $ctx, $path, 0;
1085 root 1.18 }
1086    
1087 root 1.20 sub log_to_syslog {
1088 root 1.40 my ($ctx, $facility) = @_;
1089 root 1.20
1090     require Sys::Syslog;
1091    
1092 root 1.21 $ctx->fmt_cb (sub {
1093     my $str = $_[3];
1094     $str =~ s/\n(?=.)/\n+ /g;
1095    
1096     [$_[2], "($_[1][0]) $str"]
1097     });
1098    
1099 root 1.40 $facility ||= "user";
1100    
1101 root 1.20 $ctx->log_cb (sub {
1102 root 1.21 my $lvl = $_[0][0] < 9 ? $_[0][0] : 8;
1103 root 1.20
1104 root 1.40 Sys::Syslog::syslog ("$facility|" . ($lvl - 1), $_)
1105 root 1.21 for split /\n/, $_[0][1];
1106 root 1.20
1107     0
1108     });
1109     }
1110    
1111 root 1.18 =back
1112    
1113     =head3 MESSAGE LOGGING
1114    
1115     These methods allow you to log messages directly to a context, without
1116     going via your package context.
1117    
1118     =over 4
1119    
1120 root 1.8 =item $ctx->log ($level, $msg[, @params])
1121    
1122     Same as C<AnyEvent::Log::log>, but uses the given context as log context.
1123    
1124 root 1.52 Example: log a message in the context of another package.
1125    
1126     (AnyEvent::Log::ctx "Other::Package")->log (warn => "heely bo");
1127    
1128 root 1.8 =item $logger = $ctx->logger ($level[, \$enabled])
1129    
1130     Same as C<AnyEvent::Log::logger>, but uses the given context as log
1131     context.
1132    
1133     =cut
1134    
1135     *log = \&AnyEvent::Log::_log;
1136     *logger = \&AnyEvent::Log::_logger;
1137    
1138 root 1.27 =back
1139    
1140     =cut
1141    
1142     package AnyEvent::Log;
1143    
1144     =head1 CONFIGURATION VIA $ENV{PERL_ANYEVENT_LOG}
1145    
1146     Logging can also be configured by setting the environment variable
1147     C<PERL_ANYEVENT_LOG> (or C<AE_LOG>).
1148    
1149     The value consists of one or more logging context specifications separated
1150     by C<:> or whitespace. Each logging specification in turn starts with a
1151     context name, followed by C<=>, followed by zero or more comma-separated
1152     configuration directives, here are some examples:
1153    
1154     # set default logging level
1155     filter=warn
1156    
1157     # log to file instead of to stderr
1158     log=file=/tmp/mylog
1159    
1160     # log to file in addition to stderr
1161     log=+%file:%file=file=/tmp/mylog
1162    
1163     # enable debug log messages, log warnings and above to syslog
1164     filter=debug:log=+%warnings:%warnings=warn,syslog=LOG_LOCAL0
1165    
1166     # log trace messages (only) from AnyEvent::Debug to file
1167     AnyEvent::Debug=+%trace:%trace=only,trace,file=/tmp/tracelog
1168    
1169     A context name in the log specification can be any of the following:
1170    
1171     =over 4
1172    
1173     =item C<collect>, C<filter>, C<log>
1174    
1175     Correspond to the three predefined C<$AnyEvent::Log::COLLECT>,
1176     C<AnyEvent::Log::FILTER> and C<$AnyEvent::Log::LOG> contexts.
1177    
1178     =item C<%name>
1179    
1180     Context names starting with a C<%> are anonymous contexts created when the
1181     name is first mentioned. The difference to package contexts is that by
1182     default they have no attached slaves.
1183    
1184     =item a perl package name
1185    
1186     Any other string references the logging context associated with the given
1187     Perl C<package>. In the unlikely case where you want to specify a package
1188     context that matches on of the other context name forms, you can add a
1189     C<::> to the package name to force interpretation as a package.
1190    
1191     =back
1192    
1193     The configuration specifications can be any number of the following:
1194    
1195     =over 4
1196    
1197     =item C<stderr>
1198    
1199     Configures the context to use Perl's C<warn> function (which typically
1200     logs to C<STDERR>). Works like C<log_to_warn>.
1201    
1202     =item C<file=>I<path>
1203    
1204     Configures the context to log to a file with the given path. Works like
1205     C<log_to_file>.
1206    
1207     =item C<path=>I<path>
1208    
1209     Configures the context to log to a file with the given path. Works like
1210     C<log_to_path>.
1211    
1212     =item C<syslog> or C<syslog=>I<expr>
1213    
1214 root 1.32 Configures the context to log to syslog. If I<expr> is given, then it is
1215 root 1.27 evaluated in the L<Sys::Syslog> package, so you could use:
1216    
1217     log=syslog=LOG_LOCAL0
1218    
1219     =item C<nolog>
1220    
1221     Configures the context to not log anything by itself, which is the
1222     default. Same as C<< $ctx->log_cb (undef) >>.
1223    
1224 root 1.45 =item C<cap=>I<level>
1225    
1226     Caps logging messages entering this context at the given level, i.e.
1227     reduces the priority of messages with higher priority than this level. The
1228     default is C<0> (or C<off>), meaning the priority will not be touched.
1229    
1230 root 1.27 =item C<0> or C<off>
1231    
1232 root 1.45 Sets the logging level of the context to C<0>, i.e. all messages will be
1233 root 1.27 filtered out.
1234    
1235     =item C<all>
1236    
1237     Enables all logging levels, i.e. filtering will effectively be switched
1238     off (the default).
1239    
1240     =item C<only>
1241    
1242     Disables all logging levels, and changes the interpretation of following
1243     level specifications to enable the specified level only.
1244    
1245     Example: only enable debug messages for a context.
1246    
1247     context=only,debug
1248    
1249     =item C<except>
1250    
1251     Enables all logging levels, and changes the interpretation of following
1252     level specifications to disable that level. Rarely used.
1253    
1254     Example: enable all logging levels except fatal and trace (this is rather
1255     nonsensical).
1256    
1257     filter=exept,fatal,trace
1258    
1259     =item C<level>
1260    
1261     Enables all logging levels, and changes the interpretation of following
1262     level specifications to be "that level or any higher priority
1263     message". This is the default.
1264    
1265     Example: log anything at or above warn level.
1266    
1267     filter=warn
1268    
1269     # or, more verbose
1270     filter=only,level,warn
1271    
1272 root 1.32 =item C<1>..C<9> or a logging level name (C<error>, C<debug> etc.)
1273 root 1.27
1274     A numeric loglevel or the name of a loglevel will be interpreted according
1275     to the most recent C<only>, C<except> or C<level> directive. By default,
1276     specifying a logging level enables that and any higher priority messages.
1277    
1278     =item C<+>I<context>
1279    
1280 root 1.32 Attaches the named context as slave to the context.
1281 root 1.27
1282     =item C<+>
1283    
1284 root 1.47 A lone C<+> detaches all contexts, i.e. clears the slave list from the
1285 root 1.32 context. Anonymous (C<%name>) contexts have no attached slaves by default,
1286     but package contexts have the parent context as slave by default.
1287 root 1.27
1288     Example: log messages from My::Module to a file, do not send them to the
1289     default log collector.
1290    
1291     My::Module=+,file=/tmp/mymodulelog
1292 root 1.1
1293     =back
1294    
1295 root 1.30 Any character can be escaped by prefixing it with a C<\> (backslash), as
1296 root 1.33 usual, so to log to a file containing a comma, colon, backslash and some
1297     spaces in the filename, you would do this:
1298 root 1.30
1299     PERL_ANYEVENT_LOG='log=file=/some\ \:file\ with\,\ \\-escapes'
1300    
1301     Since whitespace (which includes newlines) is allowed, it is fine to
1302     specify multiple lines in C<PERL_ANYEVENT_LOG>, e.g.:
1303    
1304     PERL_ANYEVENT_LOG="
1305     filter=warn
1306     AnyEvent::Debug=+%trace
1307     %trace=only,trace,+log
1308     " myprog
1309    
1310     Also, in the unlikely case when you want to concatenate specifications,
1311     use whitespace as separator, as C<::> will be interpreted as part of a
1312     module name, an empty spec with two separators:
1313    
1314     PERL_ANYEVENT_LOG="$PERL_ANYEVENT_LOG MyMod=debug"
1315    
1316 root 1.27 =cut
1317    
1318     for (my $spec = $ENV{PERL_ANYEVENT_LOG}) {
1319     my %anon;
1320    
1321     my $pkg = sub {
1322 root 1.29 $_[0] eq "log" ? $LOG
1323     : $_[0] eq "filter" ? $FILTER
1324     : $_[0] eq "collect" ? $COLLECT
1325 root 1.45 : $_[0] =~ /^%(.+)$/ ? ($anon{$1} ||= do { my $ctx = ctx undef; $ctx->[0] = $_[0]; $ctx })
1326 root 1.29 : $_[0] =~ /^(.*?)(?:::)?$/ ? ctx "$1" # egad :/
1327     : die # never reached?
1328 root 1.27 };
1329    
1330 root 1.29 /\G[[:space:]]+/gc; # skip initial whitespace
1331    
1332     while (/\G((?:[^:=[:space:]]+|::|\\.)+)=/gc) {
1333 root 1.27 my $ctx = $pkg->($1);
1334     my $level = "level";
1335    
1336     while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) {
1337     for ("$1") {
1338     if ($_ eq "stderr" ) { $ctx->log_to_warn;
1339     } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1");
1340     } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1");
1341 root 1.45 } elsif (/^syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog ("$1");
1342 root 1.27 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef);
1343 root 1.45 } elsif (/^cap=(.+)/ ) { $ctx->cap ("$1");
1344 root 1.27 } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1"));
1345     } elsif ($_ eq "+" ) { $ctx->slaves;
1346     } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0);
1347     } elsif ($_ eq "all" ) { $ctx->level ("all");
1348     } elsif ($_ eq "level" ) { $ctx->level ("all"); $level = "level";
1349     } elsif ($_ eq "only" ) { $ctx->level ("off"); $level = "enable";
1350     } elsif ($_ eq "except" ) { $ctx->level ("all"); $level = "disable";
1351     } elsif (/^\d$/ ) { $ctx->$level ($_);
1352     } elsif (exists $STR2LEVEL{$_} ) { $ctx->$level ($_);
1353     } else { die "PERL_ANYEVENT_LOG ($spec): parse error at '$_'\n";
1354     }
1355     }
1356    
1357     /\G,/gc or last;
1358     }
1359    
1360 root 1.29 /\G[:[:space:]]+/gc or last;
1361 root 1.27 }
1362    
1363 root 1.29 /\G[[:space:]]+/gc; # skip trailing whitespace
1364    
1365 root 1.27 if (/\G(.+)/g) {
1366     die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n";
1367     }
1368     }
1369    
1370 root 1.12 =head1 EXAMPLES
1371    
1372 root 1.28 This section shows some common configurations, both as code, and as
1373     C<PERL_ANYEVENT_LOG> string.
1374 root 1.12
1375     =over 4
1376    
1377     =item Setting the global logging level.
1378    
1379 root 1.28 Either put C<PERL_ANYEVENT_VERBOSE=><number> into your environment before
1380     running your program, use C<PERL_ANYEVENT_LOG> or modify the log level of
1381     the root context at runtime:
1382 root 1.12
1383     PERL_ANYEVENT_VERBOSE=5 ./myprog
1384    
1385 root 1.28 PERL_ANYEVENT_LOG=log=warn
1386    
1387 root 1.18 $AnyEvent::Log::FILTER->level ("warn");
1388 root 1.12
1389     =item Append all messages to a file instead of sending them to STDERR.
1390    
1391     This is affected by the global logging level.
1392    
1393 root 1.28 $AnyEvent::Log::LOG->log_to_file ($path);
1394    
1395     PERL_ANYEVENT_LOG=log=file=/some/path
1396 root 1.12
1397     =item Write all messages with priority C<error> and higher to a file.
1398    
1399     This writes them only when the global logging level allows it, because
1400     it is attached to the default context which is invoked I<after> global
1401     filtering.
1402    
1403 root 1.43 $AnyEvent::Log::FILTER->attach (
1404 root 1.18 new AnyEvent::Log::Ctx log_to_file => $path);
1405 root 1.12
1406 root 1.28 PERL_ANYEVENT_LOG=filter=+%filelogger:%filelogger=file=/some/path
1407    
1408 root 1.12 This writes them regardless of the global logging level, because it is
1409     attached to the toplevel context, which receives all messages I<before>
1410     the global filtering.
1411    
1412 root 1.18 $AnyEvent::Log::COLLECT->attach (
1413     new AnyEvent::Log::Ctx log_to_file => $path);
1414 root 1.12
1415 root 1.28 PERL_ANYEVENT_LOG=%filelogger=file=/some/path:collect=+%filelogger
1416    
1417 root 1.18 In both cases, messages are still written to STDERR.
1418 root 1.12
1419 root 1.45 =item Additionally log all messages with C<warn> and higher priority to
1420     C<syslog>, but cap at C<error>.
1421    
1422     This logs all messages to the default log target, but also logs messages
1423     with priority C<warn> or higher (and not filtered otherwise) to syslog
1424     facility C<user>. Messages with priority higher than C<error> will be
1425     logged with level C<error>.
1426    
1427     $AnyEvent::Log::LOG->attach (
1428     new AnyEvent::Log::Ctx
1429     level => "warn",
1430     cap => "error",
1431     syslog => "user",
1432     );
1433    
1434     PERL_ANYEVENT_LOG=log=+%syslog:%syslog=warn,cap=error,syslog
1435    
1436 root 1.12 =item Write trace messages (only) from L<AnyEvent::Debug> to the default logging target(s).
1437    
1438 root 1.18 Attach the C<$AnyEvent::Log::LOG> context to the C<AnyEvent::Debug>
1439     context - this simply circumvents the global filtering for trace messages.
1440 root 1.12
1441     my $debug = AnyEvent::Debug->AnyEvent::Log::ctx;
1442 root 1.18 $debug->attach ($AnyEvent::Log::LOG);
1443 root 1.12
1444 root 1.28 PERL_ANYEVENT_LOG=AnyEvent::Debug=+log
1445    
1446 root 1.18 This of course works for any package, not just L<AnyEvent::Debug>, but
1447     assumes the log level for AnyEvent::Debug hasn't been changed from the
1448     default.
1449 root 1.13
1450 root 1.12 =back
1451    
1452 root 1.1 =head1 AUTHOR
1453    
1454     Marc Lehmann <schmorp@schmorp.de>
1455 root 1.59 http://anyevent.schmorp.de
1456 root 1.1
1457     =cut
1458 root 1.28
1459 root 1.53 1
1460