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.46 by root, Sun Oct 2 01:22:01 2011 UTC vs.
Revision 1.66 by root, Mon Mar 11 20:48:19 2019 UTC

6 6
7Simple uses: 7Simple uses:
8 8
9 use AnyEvent; 9 use AnyEvent;
10 10
11 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 AE::log debug => "the function returned 3";
11 AE::log trace => "going to call function abc"; 19 AE::log trace => "going to call function abc";
12 AE::log debug => "the function returned 3";
13 AE::log info => "file soandso successfully deleted";
14 AE::log note => "wanted to create config, but config was alraedy created";
15 AE::log warn => "couldn't delete the file";
16 AE::log error => "failed to retrieve data";
17 AE::log crit => "the battery temperature is too hot";
18 AE::log alert => "the battery died";
19 AE::log fatal => "no config found, cannot continue"; # never returns
20 20
21Log level overview: 21Log level overview:
22 22
23 LVL NAME SYSLOG PERL NOTE 23 LVL NAME SYSLOG PERL NOTE
24 1 fatal emerg exit system unusable, aborts program! 24 1 fatal emerg exit system unusable, aborts program!
33 33
34"Complex" uses (for speed sensitive code, e.g. trace/debug messages): 34"Complex" uses (for speed sensitive code, e.g. trace/debug messages):
35 35
36 use AnyEvent::Log; 36 use AnyEvent::Log;
37 37
38 my $tracer = AnyEvent::Log::logger trace => \$my $trace; 38 my $tracer = AnyEvent::Log::logger trace => \my $trace;
39 39
40 $tracer->("i am here") if $trace; 40 $tracer->("i am here") if $trace;
41 $tracer->(sub { "lots of data: " . Dumper $self }) if $trace; 41 $tracer->(sub { "lots of data: " . Dumper $self }) if $trace;
42 42
43Configuration (also look at the EXAMPLES section): 43Configuration (also look at the EXAMPLES section):
61attempt to be "the" logging solution or even "a" logging solution for 61attempt to be "the" logging solution or even "a" logging solution for
62AnyEvent - AnyEvent simply creates logging messages internally, and this 62AnyEvent - AnyEvent simply creates logging messages internally, and this
63module more or less exposes the mechanism, with some extra spiff to allow 63module more or less exposes the mechanism, with some extra spiff to allow
64using it from other modules as well. 64using it from other modules as well.
65 65
66Remember that the default verbosity level is C<0> (C<off>), so nothing 66Remember that the default verbosity level is C<4> (C<error>), so only
67will be logged, unless you set C<PERL_ANYEVENT_VERBOSE> to a higher number 67errors and more important messages will be logged, unless you set
68before starting your program, or change the logging level at runtime with 68C<PERL_ANYEVENT_VERBOSE> to a higher number before starting your program
69something like: 69(C<AE_VERBOSE=5> is recommended during development), or change the logging
70level at runtime with something like:
70 71
71 use AnyEvent::Log; 72 use AnyEvent::Log;
72 $AnyEvent::Log::FILTER->level ("info"); 73 $AnyEvent::Log::FILTER->level ("info");
73 74
74The design goal behind this module was to keep it simple (and small), 75The design goal behind this module was to keep it simple (and small),
75but make it powerful enough to be potentially useful for any module, and 76but make it powerful enough to be potentially useful for any module,
76extensive enough for the most common tasks, such as logging to multiple 77and extensive enough for the most common tasks, such as logging to
77targets, or being able to log into a database. 78multiple targets, or being able to log into a database.
78 79
79The module is also usable before AnyEvent itself is initialised, in which 80The module is also usable before AnyEvent itself is initialised, in which
80case some of the functionality might be reduced. 81case some of the functionality might be reduced.
81 82
82The amount of documentation might indicate otherwise, but the runtime part 83The amount of documentation might indicate otherwise, but the runtime part
106is the "official" name, the second one the "syslog" name (if it differs) 107is the "official" name, the second one the "syslog" name (if it differs)
107and the third one the "perl" name, suggesting (only!) that you log C<die> 108and the third one the "perl" name, suggesting (only!) that you log C<die>
108messages at C<error> priority. The NOTE column tries to provide some 109messages at C<error> priority. The NOTE column tries to provide some
109rationale on how to chose a logging level. 110rationale on how to chose a logging level.
110 111
111As a rough guideline, levels 1..3 are primarily meant for users of 112As a rough guideline, levels 1..3 are primarily meant for users of the
112the program (admins, staff), and are the only logged to STDERR by 113program (admins, staff), and are the only ones logged to STDERR by
113default. Levels 4..6 are meant for users and developers alike, while 114default. Levels 4..6 are meant for users and developers alike, while
114levels 7..9 are usually meant for developers. 115levels 7..9 are usually meant for developers.
115 116
116You can normally only log a single message at highest priority level 117You can normally only log a message once at highest priority level (C<1>,
117(C<1>, C<fatal>), because logging a fatal message will also quit the 118C<fatal>), because logging a fatal message will also quit the program - so
118program - so use it sparingly :) 119use it sparingly :)
120
121For example, a program that finds an unknown switch on the commandline
122might well use a fatal logging level to tell users about it - the "system"
123in this case would be the program, or module.
119 124
120Some methods also offer some extra levels, such as C<0>, C<off>, C<none> 125Some methods also offer some extra levels, such as C<0>, C<off>, C<none>
121or C<all> - these are only valid in the methods they are documented for. 126or C<all> - these are only valid for the methods that documented them.
122 127
123=head1 LOGGING FUNCTIONS 128=head1 LOGGING FUNCTIONS
124 129
125These functions allow you to log messages. They always use the caller's 130The following functions allow you to log messages. They always use the
126package as a "logging context". Also, the main logging function C<log> is 131caller's package as a "logging context". Also, the main logging function,
127callable as C<AnyEvent::log> or C<AE::log> when the C<AnyEvent> module is 132C<log>, is aliased to C<AnyEvent::log> and C<AE::log> when the C<AnyEvent>
128loaded. 133module is loaded.
129 134
130=over 4 135=over 4
131 136
132=cut 137=cut
133 138
148our ($COLLECT, $FILTER, $LOG); 153our ($COLLECT, $FILTER, $LOG);
149 154
150our ($now_int, $now_str1, $now_str2); 155our ($now_int, $now_str1, $now_str2);
151 156
152# Format Time, not public - yet? 157# Format Time, not public - yet?
153sub ft($) { 158sub format_time($) {
154 my $i = int $_[0]; 159 my $i = int $_[0];
155 my $f = sprintf "%06d", 1e6 * ($_[0] - $i); 160 my $f = sprintf "%06d", 1e6 * ($_[0] - $i);
156 161
157 ($now_int, $now_str1, $now_str2) = ($i, split /\x01/, POSIX::strftime "%Y-%m-%d %H:%M:%S.\x01 %z", localtime $i) 162 ($now_int, $now_str1, $now_str2) = ($i, split /\x01/, POSIX::strftime "%Y-%m-%d %H:%M:%S.\x01 %z", localtime $i)
158 if $now_int != $i; 163 if $now_int != $i;
257}; 262};
258 263
259our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace); 264our @LEVEL2STR = qw(0 fatal alert crit error warn note info debug trace);
260 265
261# time, ctx, level, msg 266# time, ctx, level, msg
262sub _format($$$$) { 267sub default_format($$$$) {
263 my $ts = ft $_[0]; 268 my $ts = format_time $_[0];
264 my $ct = " "; 269 my $ct = " ";
265 270
266 my @res; 271 my @res;
267 272
268 for (split /\n/, sprintf "%-5s %s: %s", $LEVEL2STR[$_[2]], $_[1][0], $_[3]) { 273 for (split /\n/, sprintf "%-5s %s: %s", $LEVEL2STR[$_[2]], $_[1][0], $_[3]) {
317 }; 322 };
318 323
319 # format msg 324 # format msg
320 my $str = $ctx->[4] 325 my $str = $ctx->[4]
321 ? $ctx->[4]($now, $_[0], $level, $format) 326 ? $ctx->[4]($now, $_[0], $level, $format)
322 : ($fmt[$level] ||= _format $now, $_[0], $level, $format); 327 : ($fmt[$level] ||= default_format $now, $_[0], $level, $format);
323 328
324 $success = 1; 329 $success = 1;
325 330
326 $ctx->[3]($str) 331 $ctx->[3]($str)
327 or push @ctx, values %{ $ctx->[2] }; # not consumed - propagate 332 or push @ctx, values %{ $ctx->[2] }; # not consumed - propagate
449Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been 454Since C<AnyEvent::Log> has to work even before the L<AnyEvent> has been
450initialised, this switch will also decide whether to use C<CORE::time> or 455initialised, this switch will also decide whether to use C<CORE::time> or
451C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes 456C<Time::HiRes::time> when logging a message before L<AnyEvent> becomes
452available. 457available.
453 458
459=item AnyEvent::Log::format_time $timestamp
460
461Formats a timestamp as returned by C<< AnyEvent->now >> or C<<
462AnyEvent->time >> or many other functions in the same way as
463C<AnyEvent::Log> does.
464
465In your main program (as opposed to in your module) you can override
466the default timestamp display format by loading this module and then
467redefining this function.
468
469Most commonly, this function can be used in formatting callbacks.
470
471=item AnyEvent::Log::default_format $time, $ctx, $level, $msg
472
473Format a log message using the given timestamp, logging context, log level
474and log message.
475
476This is the formatting function used to format messages when no custom
477function is provided.
478
479In your main program (as opposed to in your module) you can override the
480default message format by loading this module and then redefining this
481function.
482
483=item AnyEvent::Log::fatal_exit()
484
485This is the function that is called after logging a C<fatal> log
486message. It must not return.
487
488The default implementation simply calls C<exit 1>.
489
490In your main program (as opposed to in your module) you can override
491the fatal exit function by loading this module and then redefining this
492function. Make sure you don't return.
493
454=back 494=back
455 495
456=head1 LOGGING CONTEXTS 496=head1 LOGGING CONTEXTS
457 497
458This module associates every log message with a so-called I<logging 498This module associates every log message with a so-called I<logging
859the logging (which consists of formatting the message and printing it or 899the logging (which consists of formatting the message and printing it or
860whatever it wants to do with it). 900whatever it wants to do with it).
861 901
862=over 4 902=over 4
863 903
864=item $ctx->log_cb ($cb->($str) 904=item $ctx->log_cb ($cb->($str))
865 905
866Replaces the logging callback on the context (C<undef> disables the 906Replaces the logging callback on the context (C<undef> disables the
867logging callback). 907logging callback).
868 908
869The logging callback is responsible for handling formatted log messages 909The logging callback is responsible for handling formatted log messages
894 934
895Replaces the formatting callback on the context (C<undef> restores the 935Replaces the formatting callback on the context (C<undef> restores the
896default formatter). 936default formatter).
897 937
898The callback is passed the (possibly fractional) timestamp, the original 938The callback is passed the (possibly fractional) timestamp, the original
899logging context, the (numeric) logging level and the raw message string 939logging context (object, not title), the (numeric) logging level and
900and needs to return a formatted log message. In most cases this will be a 940the raw message string and needs to return a formatted log message. In
901string, but it could just as well be an array reference that just stores 941most cases this will be a string, but it could just as well be an array
902the values. 942reference that just stores the values.
903 943
904If, for some reason, you want to use C<caller> to find out more baout the 944If, for some reason, you want to use C<caller> to find out more about the
905logger then you should walk up the call stack until you are no longer 945logger then you should walk up the call stack until you are no longer
906inside the C<AnyEvent::Log> package. 946inside the C<AnyEvent::Log> package.
907 947
948To implement your own logging callback, you might find the
949C<AnyEvent::Log::format_time> and C<AnyEvent::Log::default_format>
950functions useful.
951
952Example: format the message just as AnyEvent::Log would, by letting
953AnyEvent::Log do the work. This is a good basis to design a formatting
954callback that only changes minor aspects of the formatting.
955
956 $ctx->fmt_cb (sub {
957 my ($time, $ctx, $lvl, $msg) = @_;
958
959 AnyEvent::Log::default_format $time, $ctx, $lvl, $msg
960 });
961
908Example: format just the raw message, with numeric log level in angle 962Example: format just the raw message, with numeric log level in angle
909brackets. 963brackets.
910 964
911 $ctx->fmt_cb (sub { 965 $ctx->fmt_cb (sub {
912 my ($time, $ctx, $lvl, $msg) = @_; 966 my ($time, $ctx, $lvl, $msg) = @_;
913 967
914 "<$lvl>$msg\n" 968 "<$lvl>$msg\n"
915 }); 969 });
916 970
917Example: return an array reference with just the log values, and use 971Example: return an array reference with just the log values, and use
918C<PApp::SQL::sql_exec> to store the emssage in a database. 972C<PApp::SQL::sql_exec> to store the message in a database.
919 973
920 $ctx->fmt_cb (sub { \@_ }); 974 $ctx->fmt_cb (sub { \@_ });
921 $ctx->log_cb (sub { 975 $ctx->log_cb (sub {
922 my ($msg) = @_; 976 my ($msg) = @_;
923 977
935Sets the C<log_cb> to simply use C<CORE::warn> to report any messages 989Sets the C<log_cb> to simply use C<CORE::warn> to report any messages
936(usually this logs to STDERR). 990(usually this logs to STDERR).
937 991
938=item $ctx->log_to_file ($path) 992=item $ctx->log_to_file ($path)
939 993
940Sets the C<log_cb> to log to a file (by appending), unbuffered. 994Sets the C<log_cb> to log to a file (by appending), unbuffered. The
995function might return before the log file has been opened or created.
941 996
942=item $ctx->log_to_path ($path) 997=item $ctx->log_to_path ($path)
943 998
944Same as C<< ->log_to_file >>, but opens the file for each message. This 999Same as C<< ->log_to_file >>, but opens the file for each message. This
945is much slower, but allows you to change/move/rename/delete the file at 1000is much slower, but allows you to change/move/rename/delete the file at
980 warn shift; 1035 warn shift;
981 0 1036 0
982 }); 1037 });
983} 1038}
984 1039
1040# this function is a good example of why threads are a must,
1041# simply for priority inversion.
1042sub _log_to_disk {
1043 # eval'uating this at runtime saves 220kb rss - perl has become
1044 # an insane memory waster.
1045 eval q{ # poor man's autoloading {}
1046 sub _log_to_disk {
1047 my ($ctx, $path, $keepopen) = @_;
1048
1049 my $fh;
1050 my @queue;
1051 my $delay;
1052 my $disable;
1053
1054 use AnyEvent::IO ();
1055
1056 my $kick = sub {
1057 undef $delay;
1058 return unless @queue;
1059 $delay = 1;
1060
1061 # we pass $kick to $kick, so $kick itself doesn't keep a reference to $kick.
1062 my $kick = shift;
1063
1064 # write one or more messages
1065 my $write = sub {
1066 # we write as many messages as have been queued
1067 my $data = join "", @queue;
1068 @queue = ();
1069
1070 AnyEvent::IO::aio_write $fh, $data, sub {
1071 $disable = 1;
1072 @_
1073 ? ($_[0] == length $data or AE::log 4 => "unable to write to logfile '$path': short write")
1074 : AE::log 4 => "unable to write to logfile '$path': $!";
1075 undef $disable;
1076
1077 if ($keepopen) {
1078 $kick->($kick);
1079 } else {
1080 AnyEvent::IO::aio_close ($fh, sub {
1081 undef $fh;
1082 $kick->($kick);
1083 });
1084 }
1085 };
1086 };
1087
1088 if ($fh) {
1089 $write->();
1090 } else {
1091 AnyEvent::IO::aio_open
1092 $path,
1093 AnyEvent::IO::O_CREAT | AnyEvent::IO::O_WRONLY | AnyEvent::IO::O_APPEND,
1094 0666,
1095 sub {
1096 $fh = shift
1097 or do {
1098 $disable = 1;
1099 AE::log 4 => "unable to open logfile '$path': $!";
1100 undef $disable;
1101 return;
1102 };
1103
1104 $write->();
1105 }
1106 ;
1107 }
1108 };
1109
1110 $ctx->log_cb (sub {
1111 return if $disable;
1112 push @queue, shift;
1113 $kick->($kick) unless $delay;
1114 0
1115 });
1116
1117 $kick->($kick) if $keepopen; # initial open
1118 };
1119 };
1120 die if $@;
1121 &_log_to_disk
1122}
1123
985sub log_to_file { 1124sub log_to_file {
986 my ($ctx, $path) = @_; 1125 my ($ctx, $path) = @_;
987 1126
988 open my $fh, ">>", $path 1127 _log_to_disk $ctx, $path, 1;
989 or die "$path: $!";
990
991 $ctx->log_cb (sub {
992 syswrite $fh, shift;
993 0
994 });
995} 1128}
996 1129
997sub log_to_path { 1130sub log_to_path {
998 my ($ctx, $path) = @_; 1131 my ($ctx, $path) = @_;
999 1132
1000 $ctx->log_cb (sub { 1133 _log_to_disk $ctx, $path, 0;
1001 open my $fh, ">>", $path
1002 or die "$path: $!";
1003
1004 syswrite $fh, shift;
1005 0
1006 });
1007} 1134}
1008 1135
1009sub log_to_syslog { 1136sub log_to_syslog {
1010 my ($ctx, $facility) = @_; 1137 my ($ctx, $facility) = @_;
1011 1138
1040=over 4 1167=over 4
1041 1168
1042=item $ctx->log ($level, $msg[, @params]) 1169=item $ctx->log ($level, $msg[, @params])
1043 1170
1044Same as C<AnyEvent::Log::log>, but uses the given context as log context. 1171Same as C<AnyEvent::Log::log>, but uses the given context as log context.
1172
1173Example: log a message in the context of another package.
1174
1175 (AnyEvent::Log::ctx "Other::Package")->log (warn => "heely bo");
1045 1176
1046=item $logger = $ctx->logger ($level[, \$enabled]) 1177=item $logger = $ctx->logger ($level[, \$enabled])
1047 1178
1048Same as C<AnyEvent::Log::logger>, but uses the given context as log 1179Same as C<AnyEvent::Log::logger>, but uses the given context as log
1049context. 1180context.
1097 1228
1098Context names starting with a C<%> are anonymous contexts created when the 1229Context names starting with a C<%> are anonymous contexts created when the
1099name is first mentioned. The difference to package contexts is that by 1230name is first mentioned. The difference to package contexts is that by
1100default they have no attached slaves. 1231default they have no attached slaves.
1101 1232
1233This makes it possible to create new log contexts that can be refered to
1234multiple times by name within the same log specification.
1235
1102=item a perl package name 1236=item a perl package name
1103 1237
1104Any other string references the logging context associated with the given 1238Any other string references the logging context associated with the given
1105Perl C<package>. In the unlikely case where you want to specify a package 1239Perl C<package>. In the unlikely case where you want to specify a package
1106context that matches on of the other context name forms, you can add a 1240context that matches on of the other context name forms, you can add a
1197 1331
1198Attaches the named context as slave to the context. 1332Attaches the named context as slave to the context.
1199 1333
1200=item C<+> 1334=item C<+>
1201 1335
1202A line C<+> detaches all contexts, i.e. clears the slave list from the 1336A lone C<+> detaches all contexts, i.e. clears the slave list from the
1203context. Anonymous (C<%name>) contexts have no attached slaves by default, 1337context. Anonymous (C<%name>) contexts have no attached slaves by default,
1204but package contexts have the parent context as slave by default. 1338but package contexts have the parent context as slave by default.
1205 1339
1206Example: log messages from My::Module to a file, do not send them to the 1340Example: log messages from My::Module to a file, do not send them to the
1207default log collector. 1341default log collector.
1283 if (/\G(.+)/g) { 1417 if (/\G(.+)/g) {
1284 die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n"; 1418 die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n";
1285 } 1419 }
1286} 1420}
1287 1421
12881;
1289
1290=head1 EXAMPLES 1422=head1 EXAMPLES
1291 1423
1292This section shows some common configurations, both as code, and as 1424This section shows some common configurations, both as code, and as
1293C<PERL_ANYEVENT_LOG> string. 1425C<PERL_ANYEVENT_LOG> string.
1294 1426
1367assumes the log level for AnyEvent::Debug hasn't been changed from the 1499assumes the log level for AnyEvent::Debug hasn't been changed from the
1368default. 1500default.
1369 1501
1370=back 1502=back
1371 1503
1504=head1 ASYNCHRONOUS DISK I/O
1505
1506This module uses L<AnyEvent::IO> to actually write log messages (in
1507C<log_to_file> and C<log_to_path>), so it doesn't block your program when
1508the disk is busy and a non-blocking L<AnyEvent::IO> backend is available.
1509
1372=head1 AUTHOR 1510=head1 AUTHOR
1373 1511
1374 Marc Lehmann <schmorp@schmorp.de> 1512 Marc Lehmann <schmorp@schmorp.de>
1375 http://home.schmorp.de/ 1513 http://anyevent.schmorp.de
1376 1514
1377=cut 1515=cut
1378 1516
15171
1518

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines