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.54 by root, Tue Mar 27 23:47:57 2012 UTC vs.
Revision 1.55 by root, Fri Mar 30 21:31:52 2012 UTC

864the logging (which consists of formatting the message and printing it or 864the logging (which consists of formatting the message and printing it or
865whatever it wants to do with it). 865whatever it wants to do with it).
866 866
867=over 4 867=over 4
868 868
869=item $ctx->log_cb ($cb->($str) 869=item $ctx->log_cb ($cb->($str))
870 870
871Replaces the logging callback on the context (C<undef> disables the 871Replaces the logging callback on the context (C<undef> disables the
872logging callback). 872logging callback).
873 873
874The logging callback is responsible for handling formatted log messages 874The logging callback is responsible for handling formatted log messages
940Sets 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
941(usually this logs to STDERR). 941(usually this logs to STDERR).
942 942
943=item $ctx->log_to_file ($path) 943=item $ctx->log_to_file ($path)
944 944
945Sets 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.
946 947
947=item $ctx->log_to_path ($path) 948=item $ctx->log_to_path ($path)
948 949
949Same 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
950is 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
985 warn shift; 986 warn shift;
986 0 987 0
987 }); 988 });
988} 989}
989 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::ae_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::ae_close ($fh, sub {
1032 undef $fh;
1033 $kick->($kick);
1034 });
1035 }
1036 };
1037 };
1038
1039 if ($fh) {
1040 $write->();
1041 } else {
1042 AnyEvent::IO::ae_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
990sub log_to_file { 1075sub log_to_file {
991 my ($ctx, $path) = @_; 1076 my ($ctx, $path) = @_;
992 1077
993 open my $fh, ">>", $path 1078 _log_to_disk $ctx, $path, 1;
994 or die "$path: $!";
995
996 $ctx->log_cb (sub {
997 syswrite $fh, shift;
998 0
999 });
1000} 1079}
1001 1080
1002sub log_to_path { 1081sub log_to_path {
1003 my ($ctx, $path) = @_; 1082 my ($ctx, $path) = @_;
1004 1083
1005 $ctx->log_cb (sub { 1084 _log_to_disk $ctx, $path, 0;
1006 open my $fh, ">>", $path
1007 or die "$path: $!";
1008
1009 syswrite $fh, shift;
1010 0
1011 });
1012} 1085}
1013 1086
1014sub log_to_syslog { 1087sub log_to_syslog {
1015 my ($ctx, $facility) = @_; 1088 my ($ctx, $facility) = @_;
1016 1089

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines