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.45 by root, Sun Oct 2 00:42:04 2011 UTC vs.
Revision 1.58 by root, Thu Apr 5 04:12:21 2012 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!
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),
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
191 196
192Last not least, C<$msg> might be a code reference, in which case it is 197Last not least, C<$msg> might be a code reference, in which case it is
193supposed to return the message. It will be called only then the message 198supposed to return the message. It will be called only then the message
194actually gets logged, which is useful if it is costly to create the 199actually gets logged, which is useful if it is costly to create the
195message in the first place. 200message in the first place.
201
202This function takes care of saving and restoring C<$!> and C<$@>, so you
203don't have to.
196 204
197Whether the given message will be logged depends on the maximum log level 205Whether the given message will be logged depends on the maximum log level
198and the caller's package. The return value can be used to ensure that 206and the caller's package. The return value can be used to ensure that
199messages or not "lost" - for example, when L<AnyEvent::Debug> detects a 207messages or not "lost" - for example, when L<AnyEvent::Debug> detects a
200runtime error it tries to log it at C<die> level, but if that message is 208runtime error it tries to log it at C<die> level, but if that message is
301 309
302 # log if log cb 310 # log if log cb
303 if ($ctx->[3]) { 311 if ($ctx->[3]) {
304 # logging target found 312 # logging target found
305 313
314 local ($!, $@);
315
306 # now get raw message, unless we have it already 316 # now get raw message, unless we have it already
307 unless ($now) { 317 unless ($now) {
308 $format = $format->() if ref $format; 318 $format = $format->() if ref $format;
309 $format = sprintf $format, @args if @args; 319 $format = sprintf $format, @args if @args;
310 $format =~ s/\n$//; 320 $format =~ s/\n$//;
854the logging (which consists of formatting the message and printing it or 864the logging (which consists of formatting the message and printing it or
855whatever it wants to do with it). 865whatever it wants to do with it).
856 866
857=over 4 867=over 4
858 868
859=item $ctx->log_cb ($cb->($str) 869=item $ctx->log_cb ($cb->($str))
860 870
861Replaces the logging callback on the context (C<undef> disables the 871Replaces the logging callback on the context (C<undef> disables the
862logging callback). 872logging callback).
863 873
864The logging callback is responsible for handling formatted log messages 874The logging callback is responsible for handling formatted log messages
889 899
890Replaces the formatting callback on the context (C<undef> restores the 900Replaces the formatting callback on the context (C<undef> restores the
891default formatter). 901default formatter).
892 902
893The callback is passed the (possibly fractional) timestamp, the original 903The callback is passed the (possibly fractional) timestamp, the original
894logging context, the (numeric) logging level and the raw message string 904logging context (object, not title), the (numeric) logging level and
895and needs to return a formatted log message. In most cases this will be a 905the raw message string and needs to return a formatted log message. In
896string, but it could just as well be an array reference that just stores 906most cases this will be a string, but it could just as well be an array
897the values. 907reference that just stores the values.
898 908
899If, for some reason, you want to use C<caller> to find out more baout the 909If, for some reason, you want to use C<caller> to find out more about the
900logger then you should walk up the call stack until you are no longer 910logger then you should walk up the call stack until you are no longer
901inside the C<AnyEvent::Log> package. 911inside the C<AnyEvent::Log> package.
902 912
903Example: format just the raw message, with numeric log level in angle 913Example: format just the raw message, with numeric log level in angle
904brackets. 914brackets.
908 918
909 "<$lvl>$msg\n" 919 "<$lvl>$msg\n"
910 }); 920 });
911 921
912Example: return an array reference with just the log values, and use 922Example: return an array reference with just the log values, and use
913C<PApp::SQL::sql_exec> to store the emssage in a database. 923C<PApp::SQL::sql_exec> to store the message in a database.
914 924
915 $ctx->fmt_cb (sub { \@_ }); 925 $ctx->fmt_cb (sub { \@_ });
916 $ctx->log_cb (sub { 926 $ctx->log_cb (sub {
917 my ($msg) = @_; 927 my ($msg) = @_;
918 928
930Sets the C<log_cb> to simply use C<CORE::warn> to report any messages 940Sets the C<log_cb> to simply use C<CORE::warn> to report any messages
931(usually this logs to STDERR). 941(usually this logs to STDERR).
932 942
933=item $ctx->log_to_file ($path) 943=item $ctx->log_to_file ($path)
934 944
935Sets the C<log_cb> to log to a file (by appending), unbuffered. 945Sets the C<log_cb> to log to a file (by appending), unbuffered. The
946function might return before the log file has been opened or created.
936 947
937=item $ctx->log_to_path ($path) 948=item $ctx->log_to_path ($path)
938 949
939Same as C<< ->log_to_file >>, but opens the file for each message. This 950Same as C<< ->log_to_file >>, but opens the file for each message. This
940is much slower, but allows you to change/move/rename/delete the file at 951is much slower, but allows you to change/move/rename/delete the file at
975 warn shift; 986 warn shift;
976 0 987 0
977 }); 988 });
978} 989}
979 990
991# this function is a good example of why threads are a must,
992# simply for priority inversion.
993sub _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 AnyEvent::IO::aio_write $fh, $data, sub {
1022 $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 AnyEvent::IO::aio_close ($fh, sub {
1032 undef $fh;
1033 $kick->($kick);
1034 });
1035 }
1036 };
1037 };
1038
1039 if ($fh) {
1040 $write->();
1041 } else {
1042 AnyEvent::IO::aio_open
1043 $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
980sub log_to_file { 1075sub log_to_file {
981 my ($ctx, $path) = @_; 1076 my ($ctx, $path) = @_;
982 1077
983 open my $fh, ">>", $path 1078 _log_to_disk $ctx, $path, 1;
984 or die "$path: $!";
985
986 $ctx->log_cb (sub {
987 syswrite $fh, shift;
988 0
989 });
990} 1079}
991 1080
992sub log_to_path { 1081sub log_to_path {
993 my ($ctx, $path) = @_; 1082 my ($ctx, $path) = @_;
994 1083
995 $ctx->log_cb (sub { 1084 _log_to_disk $ctx, $path, 0;
996 open my $fh, ">>", $path
997 or die "$path: $!";
998
999 syswrite $fh, shift;
1000 0
1001 });
1002} 1085}
1003 1086
1004sub log_to_syslog { 1087sub log_to_syslog {
1005 my ($ctx, $facility) = @_; 1088 my ($ctx, $facility) = @_;
1006 1089
1035=over 4 1118=over 4
1036 1119
1037=item $ctx->log ($level, $msg[, @params]) 1120=item $ctx->log ($level, $msg[, @params])
1038 1121
1039Same as C<AnyEvent::Log::log>, but uses the given context as log context. 1122Same as C<AnyEvent::Log::log>, but uses the given context as log context.
1123
1124Example: log a message in the context of another package.
1125
1126 (AnyEvent::Log::ctx "Other::Package")->log (warn => "heely bo");
1040 1127
1041=item $logger = $ctx->logger ($level[, \$enabled]) 1128=item $logger = $ctx->logger ($level[, \$enabled])
1042 1129
1043Same as C<AnyEvent::Log::logger>, but uses the given context as log 1130Same as C<AnyEvent::Log::logger>, but uses the given context as log
1044context. 1131context.
1192 1279
1193Attaches the named context as slave to the context. 1280Attaches the named context as slave to the context.
1194 1281
1195=item C<+> 1282=item C<+>
1196 1283
1197A line C<+> detaches all contexts, i.e. clears the slave list from the 1284A lone C<+> detaches all contexts, i.e. clears the slave list from the
1198context. Anonymous (C<%name>) contexts have no attached slaves by default, 1285context. Anonymous (C<%name>) contexts have no attached slaves by default,
1199but package contexts have the parent context as slave by default. 1286but package contexts have the parent context as slave by default.
1200 1287
1201Example: log messages from My::Module to a file, do not send them to the 1288Example: log messages from My::Module to a file, do not send them to the
1202default log collector. 1289default log collector.
1278 if (/\G(.+)/g) { 1365 if (/\G(.+)/g) {
1279 die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n"; 1366 die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n";
1280 } 1367 }
1281} 1368}
1282 1369
12831;
1284
1285=head1 EXAMPLES 1370=head1 EXAMPLES
1286 1371
1287This section shows some common configurations, both as code, and as 1372This section shows some common configurations, both as code, and as
1288C<PERL_ANYEVENT_LOG> string. 1373C<PERL_ANYEVENT_LOG> string.
1289 1374
1365=back 1450=back
1366 1451
1367=head1 AUTHOR 1452=head1 AUTHOR
1368 1453
1369 Marc Lehmann <schmorp@schmorp.de> 1454 Marc Lehmann <schmorp@schmorp.de>
1370 http://home.schmorp.de/ 1455 http://software.schmorp.de/pkg/AnyEvent.html
1371 1456
1372=cut 1457=cut
1373 1458
14591
1460

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines