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.26 by root, Sun Aug 21 03:29:19 2011 UTC vs.
Revision 1.27 by root, Wed Aug 24 23:59:10 2011 UTC

515 @$_ = ($_->[0], (1 << 10) - 1 - 1) 515 @$_ = ($_->[0], (1 << 10) - 1 - 1)
516 for $LOG, $FILTER, $COLLECT; 516 for $LOG, $FILTER, $COLLECT;
517 517
518 $LOG->slaves; 518 $LOG->slaves;
519 $LOG->title ('$AnyEvent::Log::LOG'); 519 $LOG->title ('$AnyEvent::Log::LOG');
520 $LOG->log_cb (sub { 520 $LOG->log_to_warn;
521 warn shift;
522 0
523 });
524 521
525 $FILTER->slaves ($LOG); 522 $FILTER->slaves ($LOG);
526 $FILTER->title ('$AnyEvent::Log::FILTER'); 523 $FILTER->title ('$AnyEvent::Log::FILTER');
527 $FILTER->level ($AnyEvent::VERBOSE); 524 $FILTER->level ($AnyEvent::VERBOSE);
528 525
818 "$msg->[3]"; 815 "$msg->[3]";
819 816
820 0 817 0
821 }); 818 });
822 819
820=item $ctx->log_to_warn
821
822Sets the C<log_cb> to simply use C<CORE::warn> to report any messages
823(usually this logs to STDERR).
824
823=item $ctx->log_to_file ($path) 825=item $ctx->log_to_file ($path)
824 826
825Sets the C<log_cb> to log to a file (by appending), unbuffered. 827Sets the C<log_cb> to log to a file (by appending), unbuffered.
826 828
827=item $ctx->log_to_path ($path) 829=item $ctx->log_to_path ($path)
828 830
829Same as C<< ->log_to_file >>, but opens the file for each message. This 831Same as C<< ->log_to_file >>, but opens the file for each message. This
830is much slower, but allows you to change/move/rename/delete the file at 832is much slower, but allows you to change/move/rename/delete the file at
831basically any time. 833basically any time.
834
835Needless(?) to say, if you do not want to be bitten by some evil person
836calling C<chdir>, the path should be absolute. Doesn't help with
837C<chroot>, but hey...
832 838
833=item $ctx->log_to_syslog ([$log_flags]) 839=item $ctx->log_to_syslog ([$log_flags])
834 840
835Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and all 841Logs all messages via L<Sys::Syslog>, mapping C<trace> to C<debug> and all
836the others in the obvious way. If specified, then the C<$log_flags> are 842the others in the obvious way. If specified, then the C<$log_flags> are
852 my ($ctx, $cb) = @_; 858 my ($ctx, $cb) = @_;
853 859
854 $ctx->[4] = $cb; 860 $ctx->[4] = $cb;
855} 861}
856 862
863sub log_to_warn {
864 my ($ctx, $path) = @_;
865
866 $ctx->log_cb (sub {
867 warn shift;
868 0
869 });
870}
871
857sub log_to_file { 872sub log_to_file {
858 my ($ctx, $path) = @_; 873 my ($ctx, $path) = @_;
859 874
860 open my $fh, ">>", $path 875 open my $fh, ">>", $path
861 or die "$path: $!"; 876 or die "$path: $!";
864 syswrite $fh, shift; 879 syswrite $fh, shift;
865 0 880 0
866 }); 881 });
867} 882}
868 883
869sub log_to_file { 884sub log_to_path {
870 my ($ctx, $path) = @_; 885 my ($ctx, $path) = @_;
871 886
872 $ctx->log_cb (sub { 887 $ctx->log_cb (sub {
873 open my $fh, ">>", $path 888 open my $fh, ">>", $path
874 or die "$path: $!"; 889 or die "$path: $!";
921=cut 936=cut
922 937
923*log = \&AnyEvent::Log::_log; 938*log = \&AnyEvent::Log::_log;
924*logger = \&AnyEvent::Log::_logger; 939*logger = \&AnyEvent::Log::_logger;
925 940
941=back
942
943=cut
944
945package AnyEvent::Log;
946
947=head1 CONFIGURATION VIA $ENV{PERL_ANYEVENT_LOG}
948
949Logging can also be configured by setting the environment variable
950C<PERL_ANYEVENT_LOG> (or C<AE_LOG>).
951
952The value consists of one or more logging context specifications separated
953by C<:> or whitespace. Each logging specification in turn starts with a
954context name, followed by C<=>, followed by zero or more comma-separated
955configuration directives, here are some examples:
956
957 # set default logging level
958 filter=warn
959
960 # log to file instead of to stderr
961 log=file=/tmp/mylog
962
963 # log to file in addition to stderr
964 log=+%file:%file=file=/tmp/mylog
965
966 # enable debug log messages, log warnings and above to syslog
967 filter=debug:log=+%warnings:%warnings=warn,syslog=LOG_LOCAL0
968
969 # log trace messages (only) from AnyEvent::Debug to file
970 AnyEvent::Debug=+%trace:%trace=only,trace,file=/tmp/tracelog
971
972A context name in the log specification can be any of the following:
973
974=over 4
975
976=item C<collect>, C<filter>, C<log>
977
978Correspond to the three predefined C<$AnyEvent::Log::COLLECT>,
979C<AnyEvent::Log::FILTER> and C<$AnyEvent::Log::LOG> contexts.
980
981=item C<%name>
982
983Context names starting with a C<%> are anonymous contexts created when the
984name is first mentioned. The difference to package contexts is that by
985default they have no attached slaves.
986
987=item a perl package name
988
989Any other string references the logging context associated with the given
990Perl C<package>. In the unlikely case where you want to specify a package
991context that matches on of the other context name forms, you can add a
992C<::> to the package name to force interpretation as a package.
993
994=back
995
996The configuration specifications can be any number of the following:
997
998=over 4
999
1000=item C<stderr>
1001
1002Configures the context to use Perl's C<warn> function (which typically
1003logs to C<STDERR>). Works like C<log_to_warn>.
1004
1005=item C<file=>I<path>
1006
1007Configures the context to log to a file with the given path. Works like
1008C<log_to_file>.
1009
1010=item C<path=>I<path>
1011
1012Configures the context to log to a file with the given path. Works like
1013C<log_to_path>.
1014
1015=item C<syslog> or C<syslog=>I<expr>
1016
1017Configured the context to log to syslog. If I<expr> is given, then it is
1018evaluated in the L<Sys::Syslog> package, so you could use:
1019
1020 log=syslog=LOG_LOCAL0
1021
1022=item C<nolog>
1023
1024Configures the context to not log anything by itself, which is the
1025default. Same as C<< $ctx->log_cb (undef) >>.
1026
1027=item C<0> or C<off>
1028
1029Sets the logging level of the context ot C<0>, i.e. all messages will be
1030filtered out.
1031
1032=item C<all>
1033
1034Enables all logging levels, i.e. filtering will effectively be switched
1035off (the default).
1036
1037=item C<only>
1038
1039Disables all logging levels, and changes the interpretation of following
1040level specifications to enable the specified level only.
1041
1042Example: only enable debug messages for a context.
1043
1044 context=only,debug
1045
1046=item C<except>
1047
1048Enables all logging levels, and changes the interpretation of following
1049level specifications to disable that level. Rarely used.
1050
1051Example: enable all logging levels except fatal and trace (this is rather
1052nonsensical).
1053
1054 filter=exept,fatal,trace
1055
1056=item C<level>
1057
1058Enables all logging levels, and changes the interpretation of following
1059level specifications to be "that level or any higher priority
1060message". This is the default.
1061
1062Example: log anything at or above warn level.
1063
1064 filter=warn
1065
1066 # or, more verbose
1067 filter=only,level,warn
1068
1069=item C<1>..C<9>, a logging level name (C<error>, C<debug> etc.)
1070
1071A numeric loglevel or the name of a loglevel will be interpreted according
1072to the most recent C<only>, C<except> or C<level> directive. By default,
1073specifying a logging level enables that and any higher priority messages.
1074
1075=item C<+>I<context>
1076
1077Adds/attaches the named context as slave to the context.
1078
1079=item C<+>
1080
1081A line C<+> clears the slave list form the context. Anonymous (C<%name>)
1082contexts have no slaves by default, but package contexts have the parent
1083context as slave by default.
1084
1085Example: log messages from My::Module to a file, do not send them to the
1086default log collector.
1087
1088 My::Module=+,file=/tmp/mymodulelog
1089
1090=back
1091
1092=cut
1093
1094for (my $spec = $ENV{PERL_ANYEVENT_LOG}) {
1095 my %anon;
1096
1097 my $pkg = sub {
1098 $_[0] eq "log" ? $LOG
1099 : $_[0] eq "filter" ? $FILTER
1100 : $_[0] eq "collect" ? $COLLECT
1101 : $_[0] =~ /^%(.+)$/ && $anon{$1} ||= ctx undef
1102 : $_[0] =~ /^(.*?)(?:::)?$/ && ctx "$1" # egad :/
1103 };
1104
1105 while (/\G((?:[^:=]+|::|\\.)+)=/gc) {
1106 my $ctx = $pkg->($1);
1107 my $level = "level";
1108
1109 while (/\G((?:[^,:[:space:]]+|::|\\.)+)/gc) {
1110 for ("$1") {
1111 if ($_ eq "stderr" ) { $ctx->log_to_warn;
1112 } elsif (/^file=(.+)/ ) { $ctx->log_to_file ("$1");
1113 } elsif (/^path=(.+)/ ) { $ctx->log_to_path ("$1");
1114 } elsif (/syslog(?:=(.*))?/ ) { require Sys::Syslog; $ctx->log_to_syslog (eval "package Sys::Syslog; $1");
1115 } elsif ($_ eq "nolog" ) { $ctx->log_cb (undef);
1116 } elsif (/^\+(.+)$/ ) { $ctx->attach ($pkg->("$1"));
1117 } elsif ($_ eq "+" ) { $ctx->slaves;
1118 } elsif ($_ eq "off" or $_ eq "0") { $ctx->level (0);
1119 } elsif ($_ eq "all" ) { $ctx->level ("all");
1120 } elsif ($_ eq "level" ) { $ctx->level ("all"); $level = "level";
1121 } elsif ($_ eq "only" ) { $ctx->level ("off"); $level = "enable";
1122 } elsif ($_ eq "except" ) { $ctx->level ("all"); $level = "disable";
1123 } elsif (/^\d$/ ) { $ctx->$level ($_);
1124 } elsif (exists $STR2LEVEL{$_} ) { $ctx->$level ($_);
1125 } else { die "PERL_ANYEVENT_LOG ($spec): parse error at '$_'\n";
1126 }
1127 }
1128
1129 /\G,/gc or last;
1130 }
1131
1132 /\G[:[:space:]]/gc or last;
1133 }
1134
1135 if (/\G(.+)/g) {
1136 die "PERL_ANYEVENT_LOG ($spec): parse error at '$1'\n";
1137 }
1138}
1139
9261; 11401;
927
928=back
929 1141
930=head1 EXAMPLES 1142=head1 EXAMPLES
931 1143
932This section shows some common configurations. 1144This section shows some common configurations.
933 1145

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines