ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Log.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent/Log.pm (file contents):
Revision 1.38 by root, Fri Aug 26 00:32:45 2011 UTC vs.
Revision 1.43 by root, Mon Sep 5 07:21:54 2011 UTC

11 AE::log debug => "hit my knee"; 11 AE::log debug => "hit my knee";
12 AE::log warn => "it's a bit too hot"; 12 AE::log warn => "it's a bit too hot";
13 AE::log error => "the flag was false!"; 13 AE::log error => "the flag was false!";
14 AE::log fatal => "the bit toggled! run!"; # never returns 14 AE::log fatal => "the bit toggled! run!"; # never returns
15 15
16 # available log levels in order:
17 # fatal alert critical error warn note info debug trace
18
16"Complex" uses (for speed sensitive code): 19"Complex" uses (for speed sensitive code):
17 20
18 use AnyEvent::Log; 21 use AnyEvent::Log;
19 22
20 my $tracer = AnyEvent::Log::logger trace => \$my $trace; 23 my $tracer = AnyEvent::Log::logger trace => \$my $trace;
32 35
33 # send all critical and higher priority messages to syslog, 36 # send all critical and higher priority messages to syslog,
34 # regardless of (most) other settings 37 # regardless of (most) other settings
35 $AnyEvent::Log::COLLECT->attach (new AnyEvent::Log::Ctx 38 $AnyEvent::Log::COLLECT->attach (new AnyEvent::Log::Ctx
36 level => "critical", 39 level => "critical",
37 log_to_syslog => 0, 40 log_to_syslog => "user",
38 ); 41 );
39 42
40=head1 DESCRIPTION 43=head1 DESCRIPTION
41 44
42This module implements a relatively simple "logging framework". It doesn't 45This module implements a relatively simple "logging framework". It doesn't
72numerical value". 75numerical value".
73 76
74Instead of specifying levels by name you can also specify them by aliases: 77Instead of specifying levels by name you can also specify them by aliases:
75 78
76 LVL NAME SYSLOG PERL NOTE 79 LVL NAME SYSLOG PERL NOTE
77 1 fatal emerg exit aborts program! 80 1 fatal emerg exit system unusable, aborts program!
78 2 alert 81 2 alert failure in primary system
79 3 critical crit 82 3 critical crit failure in backup system
80 4 error err die 83 4 error err die non-urgent program errors, a bug
81 5 warn warning 84 5 warn warning possible problem, not necessarily error
82 6 note notice 85 6 note notice unusual conditions
83 7 info 86 7 info normal messages, no action required
84 8 debug 87 8 debug debugging messages for development
85 9 trace 88 9 trace copious tracing output
86 89
87As you can see, some logging levels have multiple aliases - the first one 90As you can see, some logging levels have multiple aliases - the first one
88is the "official" name, the second one the "syslog" name (if it differs) 91is the "official" name, the second one the "syslog" name (if it differs)
89and the third one the "perl" name, suggesting that you log C<die> messages 92and the third one the "perl" name, suggesting (only!) that you log C<die>
90at C<error> priority. 93messages at C<error> priority. The NOTE column tries to provide some
94rationale on how to chose a logging level.
95
96As a rough guideline, levels 1..3 are primarily meant for users of
97the program (admins, staff), and are the only logged to STDERR by
98default. Levels 4..6 are meant for users and developers alike, while
99levels 7..9 are usually meant for developers.
91 100
92You can normally only log a single message at highest priority level 101You can normally only log a single message at highest priority level
93(C<1>, C<fatal>), because logging a fatal message will also quit the 102(C<1>, C<fatal>), because logging a fatal message will also quit the
94program - so use it sparingly :) 103program - so use it sparingly :)
95 104
151=item AnyEvent::Log::log $level, $msg[, @args] 160=item AnyEvent::Log::log $level, $msg[, @args]
152 161
153Requests logging of the given C<$msg> with the given log level, and 162Requests logging of the given C<$msg> with the given log level, and
154returns true if the message was logged I<somewhere>. 163returns true if the message was logged I<somewhere>.
155 164
156For C<fatal> log levels, the program will abort. 165For loglevel C<fatal>, the program will abort.
157 166
158If only a C<$msg> is given, it is logged as-is. With extra C<@args>, the 167If only a C<$msg> is given, it is logged as-is. With extra C<@args>, the
159C<$msg> is interpreted as an sprintf format string. 168C<$msg> is interpreted as an sprintf format string.
160 169
161The C<$msg> should not end with C<\n>, but may if that is convenient for 170The C<$msg> should not end with C<\n>, but may if that is convenient for
240 } 249 }
241 250
242 join "", @res 251 join "", @res
243} 252}
244 253
254sub fatal_exit() {
255 exit 1;
256}
257
245sub _log { 258sub _log {
246 my ($ctx, $level, $format, @args) = @_; 259 my ($ctx, $level, $format, @args) = @_;
247 260
248 $level = $level > 0 && $level <= 9 261 $level = $level > 0 && $level <= 9
249 ? $level+0 262 ? $level+0
282 } 295 }
283 } 296 }
284 } 297 }
285 while $ctx = pop @ctx; 298 while $ctx = pop @ctx;
286 299
287 exit 1 if $level <= 1; 300 fatal_exit if $level <= 1;
288 301
289 $success 302 $success
290} 303}
291 304
292sub log($$;@) { 305sub log($$;@) {
293 _log 306 _log
294 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0], 307 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
295 @_; 308 @_;
296} 309}
297 310
298*AnyEvent::log = *AE::log = \&log;
299
300=item $logger = AnyEvent::Log::logger $level[, \$enabled] 311=item $logger = AnyEvent::Log::logger $level[, \$enabled]
301 312
302Creates a code reference that, when called, acts as if the 313Creates a code reference that, when called, acts as if the
303C<AnyEvent::Log::log> function was called at this point with the given 314C<AnyEvent::Log::log> function was called at this point with the given
304level. C<$logger> is passed a C<$msg> and optional C<@args>, just as with 315level. C<$logger> is passed a C<$msg> and optional C<@args>, just as with
368 379
369 $LOGGER{$logger+0} = $logger; 380 $LOGGER{$logger+0} = $logger;
370 381
371 _reassess $logger+0; 382 _reassess $logger+0;
372 383
373 require AnyEvent::Util; 384 require AnyEvent::Util unless $AnyEvent::Util::VERSION;
374 my $guard = AnyEvent::Util::guard (sub { 385 my $guard = AnyEvent::Util::guard (sub {
375 # "clean up" 386 # "clean up"
376 delete $LOGGER{$logger+0}; 387 delete $LOGGER{$logger+0};
377 }); 388 });
378 389
395By default, C<AnyEvent::Log> will use C<AE::now>, i.e. the cached 406By default, C<AnyEvent::Log> will use C<AE::now>, i.e. the cached
396eventloop time, for the log timestamps. After calling this function with a 407eventloop time, for the log timestamps. After calling this function with a
397true value it will instead resort to C<AE::time>, i.e. fetch the current 408true value it will instead resort to C<AE::time>, i.e. fetch the current
398time on each log message. This only makes a difference for event loops 409time on each log message. This only makes a difference for event loops
399that actually cache the time (such as L<EV> or L<AnyEvent::Loop>). 410that actually cache the time (such as L<EV> or L<AnyEvent::Loop>).
411
412This setting can be changed at any time by calling this function.
400 413
401Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been 414Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been
402initialised, this switch will also decide whether to use C<CORE::time> or 415initialised, this switch will also decide whether to use C<CORE::time> or
403C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes 416C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes
404available. 417available.
529This can be used to implement config-file (re-)loading: before loading a 542This can be used to implement config-file (re-)loading: before loading a
530configuration, reset all contexts. 543configuration, reset all contexts.
531 544
532=cut 545=cut
533 546
547our $ORIG_VERBOSE = $AnyEvent::VERBOSE;
548$AnyEvent::VERBOSE = 9;
549
534sub reset { 550sub reset {
535 # hard to kill complex data structures 551 # hard to kill complex data structures
536 # we "recreate" all package loggers and reset the hierarchy 552 # we "recreate" all package loggers and reset the hierarchy
537 while (my ($k, $v) = each %CTX) { 553 while (my ($k, $v) = each %CTX) {
538 @$v = ($k, (1 << 10) - 1 - 1, { }); 554 @$v = ($k, (1 << 10) - 1 - 1, { });
547 $LOG->title ('$AnyEvent::Log::LOG'); 563 $LOG->title ('$AnyEvent::Log::LOG');
548 $LOG->log_to_warn; 564 $LOG->log_to_warn;
549 565
550 $FILTER->slaves ($LOG); 566 $FILTER->slaves ($LOG);
551 $FILTER->title ('$AnyEvent::Log::FILTER'); 567 $FILTER->title ('$AnyEvent::Log::FILTER');
552 $FILTER->level ($AnyEvent::VERBOSE); 568 $FILTER->level ($ORIG_VERBOSE);
553 569
554 $COLLECT->slaves ($FILTER); 570 $COLLECT->slaves ($FILTER);
555 $COLLECT->title ('$AnyEvent::Log::COLLECT'); 571 $COLLECT->title ('$AnyEvent::Log::COLLECT');
556 572
557 _reassess; 573 _reassess;
558} 574}
575
576# override AE::log/logger
577*AnyEvent::log = *AE::log = \&log;
578*AnyEvent::logger = *AE::logger = \&logger;
579
580# convert AnyEvent loggers to AnyEvent::Log loggers
581$_->[0] = ctx $_->[0] # convert "pkg" to "ctx"
582 for values %LOGGER;
559 583
560# create the default logger contexts 584# create the default logger contexts
561$LOG = ctx undef; 585$LOG = ctx undef;
562$FILTER = ctx undef; 586$FILTER = ctx undef;
563$COLLECT = ctx undef; 587$COLLECT = ctx undef;
862 886
863Needless(?) to say, if you do not want to be bitten by some evil person 887Needless(?) to say, if you do not want to be bitten by some evil person
864calling C<chdir>, the path should be absolute. Doesn't help with 888calling C<chdir>, the path should be absolute. Doesn't help with
865C<chroot>, but hey... 889C<chroot>, but hey...
866 890
867=item $ctx->log_to_syslog ([$log_flags]) 891=item $ctx->log_to_syslog ([$facility])
868 892
869Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and all 893Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and
870the others in the obvious way. If specified, then the C<$log_flags> are 894all the others in the obvious way. If specified, then the C<$facility> is
871simply or'ed onto the priority argument and can contain any C<LOG_xxx> 895used as the facility (C<user>, C<auth>, C<local0> and so on). The default
872flags valid for Sys::Syslog::syslog, except for the priority levels. 896facility is C<user>.
873 897
874Note that this function also sets a C<fmt_cb> - the logging part requires 898Note that this function also sets a C<fmt_cb> - the logging part requires
875an array reference with [$level, $str] as input. 899an array reference with [$level, $str] as input.
876 900
877=cut 901=cut
920 0 944 0
921 }); 945 });
922} 946}
923 947
924sub log_to_syslog { 948sub log_to_syslog {
925 my ($ctx, $flags) = @_; 949 my ($ctx, $facility) = @_;
926 950
927 require Sys::Syslog; 951 require Sys::Syslog;
928 952
929 $ctx->fmt_cb (sub { 953 $ctx->fmt_cb (sub {
930 my $str = $_[3]; 954 my $str = $_[3];
931 $str =~ s/\n(?=.)/\n+ /g; 955 $str =~ s/\n(?=.)/\n+ /g;
932 956
933 [$_[2], "($_[1][0]) $str"] 957 [$_[2], "($_[1][0]) $str"]
934 }); 958 });
935 959
960 $facility ||= "user";
961
936 $ctx->log_cb (sub { 962 $ctx->log_cb (sub {
937 my $lvl = $_[0][0] < 9 ? $_[0][0] : 8; 963 my $lvl = $_[0][0] < 9 ? $_[0][0] : 8;
938 964
939 Sys::Syslog::syslog ($flags | ($lvl - 1), $_) 965 Sys::Syslog::syslog ("$facility|" . ($lvl - 1), $_)
940 for split /\n/, $_[0][1]; 966 for split /\n/, $_[0][1];
941 967
942 0 968 0
943 }); 969 });
944} 970}
1161 while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) { 1187 while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) {
1162 for ("$1") { 1188 for ("$1") {
1163 if ($_ eq "stderr" ) { $ctx->log_to_warn; 1189 if ($_ eq "stderr" ) { $ctx->log_to_warn;
1164 } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1"); 1190 } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1");
1165 } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1"); 1191 } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1");
1166 } elsif (/syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog (eval "package Sys::Syslog; $1"); 1192 } elsif (/syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog ($1);
1167 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef); 1193 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef);
1168 } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1")); 1194 } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1"));
1169 } elsif ($_ eq "+" ) { $ctx->slaves; 1195 } elsif ($_ eq "+" ) { $ctx->slaves;
1170 } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0); 1196 } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0);
1171 } elsif ($_ eq "all" ) { $ctx->level ("all"); 1197 } elsif ($_ eq "all" ) { $ctx->level ("all");
1224 1250
1225This writes them only when the global logging level allows it, because 1251This writes them only when the global logging level allows it, because
1226it is attached to the default context which is invoked I<after> global 1252it is attached to the default context which is invoked I<after> global
1227filtering. 1253filtering.
1228 1254
1229 $AnyEvent::Log::FILTER->attach 1255 $AnyEvent::Log::FILTER->attach (
1230 new AnyEvent::Log::Ctx log_to_file => $path); 1256 new AnyEvent::Log::Ctx log_to_file => $path);
1231 1257
1232 PERL_ANYEVENT_LOG=filter=+%filelogger:%filelogger=file=/some/path 1258 PERL_ANYEVENT_LOG=filter=+%filelogger:%filelogger=file=/some/path
1233 1259
1234This writes them regardless of the global logging level, because it is 1260This writes them regardless of the global logging level, because it is

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines