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.36 by root, Thu Aug 25 05:39:47 2011 UTC vs.
Revision 1.41 by root, Thu Sep 1 04:07:18 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
84 8 debug 87 8 debug
85 9 trace 88 9 trace
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.
91 94
92You can normally only log a single message at highest priority level 95You 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 96(C<1>, C<fatal>), because logging a fatal message will also quit the
94program - so use it sparingly :) 97program - so use it sparingly :)
95 98
111 114
112use Carp (); 115use Carp ();
113use POSIX (); 116use POSIX ();
114 117
115use AnyEvent (); BEGIN { AnyEvent::common_sense } 118use AnyEvent (); BEGIN { AnyEvent::common_sense }
116use AnyEvent::Util (); 119#use AnyEvent::Util (); need to load this in a delayed fashion, as it uses AE::log
117 120
118our $VERSION = $AnyEvent::VERSION; 121our $VERSION = $AnyEvent::VERSION;
119 122
120our ($COLLECT, $FILTER, $LOG); 123our ($COLLECT, $FILTER, $LOG);
121 124
151=item AnyEvent::Log::log $level, $msg[, @args] 154=item AnyEvent::Log::log $level, $msg[, @args]
152 155
153Requests logging of the given C<$msg> with the given log level, and 156Requests logging of the given C<$msg> with the given log level, and
154returns true if the message was logged I<somewhere>. 157returns true if the message was logged I<somewhere>.
155 158
156For C<fatal> log levels, the program will abort. 159For loglevel C<fatal>, the program will abort.
157 160
158If only a C<$msg> is given, it is logged as-is. With extra C<@args>, the 161If 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. 162C<$msg> is interpreted as an sprintf format string.
160 163
161The C<$msg> should not end with C<\n>, but may if that is convenient for 164The C<$msg> should not end with C<\n>, but may if that is convenient for
206 info => 7, 209 info => 7,
207 debug => 8, 210 debug => 8,
208 trace => 9, 211 trace => 9,
209); 212);
210 213
211sub now () { time } 214our $TIME_EXACT;
215
216sub exact_time($) {
217 $TIME_EXACT = shift;
218 *_ts = $AnyEvent::MODEL
219 ? $TIME_EXACT ? \&AE::now : \&AE::time
220 : sub () { $TIME_EXACT ? do { require Time::HiRes; Time::HiRes::time () } : time };
221}
222
223BEGIN {
224 exact_time 0;
225}
212 226
213AnyEvent::post_detect { 227AnyEvent::post_detect {
214 *now = \&AE::now; 228 exact_time $TIME_EXACT;
215}; 229};
216 230
217our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace); 231our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace);
218 232
219# time, ctx, level, msg 233# time, ctx, level, msg
252 # now get raw message, unless we have it already 266 # now get raw message, unless we have it already
253 unless ($now) { 267 unless ($now) {
254 $format = $format->() if ref $format; 268 $format = $format->() if ref $format;
255 $format = sprintf $format, @args if @args; 269 $format = sprintf $format, @args if @args;
256 $format =~ s/\n$//; 270 $format =~ s/\n$//;
257 $now = now; 271 $now = _ts;
258 }; 272 };
259 273
260 # format msg 274 # format msg
261 my $str = $ctx->[4] 275 my $str = $ctx->[4]
262 ? $ctx->[4]($now, $_[0], $level, $format) 276 ? $ctx->[4]($now, $_[0], $level, $format)
357 371
358 $LOGGER{$logger+0} = $logger; 372 $LOGGER{$logger+0} = $logger;
359 373
360 _reassess $logger+0; 374 _reassess $logger+0;
361 375
376 require AnyEvent::Util;
362 my $guard = AnyEvent::Util::guard { 377 my $guard = AnyEvent::Util::guard (sub {
363 # "clean up" 378 # "clean up"
364 delete $LOGGER{$logger+0}; 379 delete $LOGGER{$logger+0};
365 }; 380 });
366 381
367 sub { 382 sub {
368 $guard if 0; # keep guard alive, but don't cause runtime overhead 383 $guard if 0; # keep guard alive, but don't cause runtime overhead
369 384
370 _log $ctx, $level, @_ 385 _log $ctx, $level, @_
375sub logger($;$) { 390sub logger($;$) {
376 _logger 391 _logger
377 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0], 392 $CTX{ (caller)[0] } ||= _pkg_ctx +(caller)[0],
378 @_ 393 @_
379} 394}
395
396=item AnyEvent::Log::exact_time $on
397
398By default, C<AnyEvent::Log> will use C<AE::now>, i.e. the cached
399eventloop time, for the log timestamps. After calling this function with a
400true value it will instead resort to C<AE::time>, i.e. fetch the current
401time on each log message. This only makes a difference for event loops
402that actually cache the time (such as L<EV> or L<AnyEvent::Loop>).
403
404This setting can be changed at any time by calling this function.
405
406Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been
407initialised, this switch will also decide whether to use C<CORE::time> or
408C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes
409available.
380 410
381=back 411=back
382 412
383=head1 LOGGING CONTEXTS 413=head1 LOGGING CONTEXTS
384 414
837 867
838Needless(?) to say, if you do not want to be bitten by some evil person 868Needless(?) to say, if you do not want to be bitten by some evil person
839calling C<chdir>, the path should be absolute. Doesn't help with 869calling C<chdir>, the path should be absolute. Doesn't help with
840C<chroot>, but hey... 870C<chroot>, but hey...
841 871
842=item $ctx->log_to_syslog ([$log_flags]) 872=item $ctx->log_to_syslog ([$facility])
843 873
844Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and all 874Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and
845the others in the obvious way. If specified, then the C<$log_flags> are 875all the others in the obvious way. If specified, then the C<$facility> is
846simply or'ed onto the priority argument and can contain any C<LOG_xxx> 876used as the facility (C<user>, C<auth>, C<local0> and so on). The default
847flags valid for Sys::Syslog::syslog, except for the priority levels. 877facility is C<user>.
848 878
849Note that this function also sets a C<fmt_cb> - the logging part requires 879Note that this function also sets a C<fmt_cb> - the logging part requires
850an array reference with [$level, $str] as input. 880an array reference with [$level, $str] as input.
851 881
852=cut 882=cut
895 0 925 0
896 }); 926 });
897} 927}
898 928
899sub log_to_syslog { 929sub log_to_syslog {
900 my ($ctx, $flags) = @_; 930 my ($ctx, $facility) = @_;
901 931
902 require Sys::Syslog; 932 require Sys::Syslog;
903 933
904 $ctx->fmt_cb (sub { 934 $ctx->fmt_cb (sub {
905 my $str = $_[3]; 935 my $str = $_[3];
906 $str =~ s/\n(?=.)/\n+ /g; 936 $str =~ s/\n(?=.)/\n+ /g;
907 937
908 [$_[2], "($_[1][0]) $str"] 938 [$_[2], "($_[1][0]) $str"]
909 }); 939 });
910 940
941 $facility ||= "user";
942
911 $ctx->log_cb (sub { 943 $ctx->log_cb (sub {
912 my $lvl = $_[0][0] < 9 ? $_[0][0] : 8; 944 my $lvl = $_[0][0] < 9 ? $_[0][0] : 8;
913 945
914 Sys::Syslog::syslog ($flags | ($lvl - 1), $_) 946 Sys::Syslog::syslog ("$facility|" . ($lvl - 1), $_)
915 for split /\n/, $_[0][1]; 947 for split /\n/, $_[0][1];
916 948
917 0 949 0
918 }); 950 });
919} 951}
1136 while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) { 1168 while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) {
1137 for ("$1") { 1169 for ("$1") {
1138 if ($_ eq "stderr" ) { $ctx->log_to_warn; 1170 if ($_ eq "stderr" ) { $ctx->log_to_warn;
1139 } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1"); 1171 } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1");
1140 } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1"); 1172 } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1");
1141 } elsif (/syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog (eval "package Sys::Syslog; $1"); 1173 } elsif (/syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog ($1);
1142 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef); 1174 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef);
1143 } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1")); 1175 } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1"));
1144 } elsif ($_ eq "+" ) { $ctx->slaves; 1176 } elsif ($_ eq "+" ) { $ctx->slaves;
1145 } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0); 1177 } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0);
1146 } elsif ($_ eq "all" ) { $ctx->level ("all"); 1178 } elsif ($_ eq "all" ) { $ctx->level ("all");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines