X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=src%2Flogger.pl;h=6e80e6c181576ded12197b77327789decaa0c50a;hb=8e78dd0efefd2643925ef2d9fa3836d49edfaa32;hp=474188c6d88aca2b6cee7aba9c263cec48418f0c;hpb=9297b6322dc6a785b2ba574a59425a24ef8daf19;p=infobot.git diff --git a/src/logger.pl b/src/logger.pl index 474188c..6e80e6c 100644 --- a/src/logger.pl +++ b/src/logger.pl @@ -13,8 +13,6 @@ use vars qw($logDate $logold $logcount $logtime $logrepeat $running); use vars qw(@backlog); use vars qw(%param %file %cache); -require 5.001; - $logtime = time(); $logcount = 0; $logrepeat = 0; @@ -45,7 +43,7 @@ use vars qw($b_black $_black $b_red $_red $b_green $_green $b_yellow $_yellow $b_blue $_blue $b_magenta $_magenta $b_cyan $_cyan $b_white $_white $_reset $_bold $ob $b); -$b_black = cl('bold black'); $_black = cl('black'); +$b_black = cl('bold black'); $_black = cl('black'); $b_red = cl('bold red'); $_red = cl('red'); $b_green = cl('bold green'); $_green = cl('green'); $b_yellow = cl('bold yellow'); $_yellow = cl('yellow'); @@ -93,16 +91,16 @@ sub openLog { } if (&IsParam("logType") and $param{'logType'} =~ /DAILY/i) { - my ($day,$month,$year) = (localtime time())[3,4,5]; + my ($day,$month,$year) = (gmtime time())[3,4,5]; $logDate = sprintf("%04d%02d%02d",$year+1900,$month+1,$day); - $file{log} .= "-".$logDate; + $file{log} .= $logDate; } if (open(LOG, ">>$file{log}")) { &status("Opened logfile $file{log}."); LOG->autoflush(1); } else { - &status("cannot open logfile $file{log}; not logging."); + &status("Cannot open logfile ($file{log}); not logging: $!"); } } @@ -189,32 +187,27 @@ sub status { my($input) = @_; my $status; - # a way to hook onto status without looping. - # todo: find why $channels{undef} is created. - if (0 and $running and !$cache{statusSafe}) { - &ircCheck(); + if ($input =~ /PERL: Use of uninitialized/) { + &debug_perl($input); + return; } if ($input eq $logold) { - # allow perl flooding - $logrepeat++ unless ($input =~ /PERL: Use of uninitialized/); - - # todo: prevent massive repetitive throttling. - if ($logrepeat >= 3) { - $logrepeat = 0; - &status("LOG: repeat throttle."); - # we block it to ensure sequence of logging is intact. - # could go with $conn->schedule but that's evil :) - sleep 1; - } - } else { - $logold = $input; + $logrepeat++; + return; + } + + $logold = $input; + # if only I had followed how sysklogd does it, heh. lame me. -xk + if ($logrepeat >= 3) { + &status("LOG: last message repeated $logrepeat times"); + $logrepeat = 0; } # if it's not a scalar, attempt to warn and fix. my $ref = ref $input; if (defined $ref and $ref ne "") { - &status("status: 'input' is not scalar ($ref)."); + &WARN("status: 'input' is not scalar ($ref)."); if ($ref eq "ARRAY") { foreach (@$input) { @@ -230,12 +223,12 @@ sub status { for ($input) { s/\n+$//; - s/\002|037//g; # bold,video,underline => remove. + s/\002|\037//g; # bold,video,underline => remove. } # does this work? if ($input =~ /\n/) { - foreach (split(/\n/, $input)) { + foreach (split /\n/, $input) { &status($_); } } @@ -254,12 +247,13 @@ sub status { my $time = time(); my $reset = 0; + # hrm... what is this supposed to achieve? nothing I guess. if ($logtime == $time) { if ($logcount < 25) { # too high? $logcount++; } else { sleep 1; - &status("LOG: Throttling."); # recursive? + &status("LOG: Throttling."); $reset++; } } else { # $logtime != $time. @@ -316,32 +310,39 @@ sub status { } elsif ($printable =~ s/^\* (\S+)\/(\S+) //) { # public action. print "$b_white*$ob $b_cyan$1$ob/$b_blue$2$ob $printable\n"; + } elsif ($printable =~ s/^(-\S+-) //) { # notice print "$_green$1 $printable$ob\n"; + } elsif ($printable =~ s/^(\* )?(\[\S+\]) //) { # message/private action from someone print "$b_white$1$ob" if (defined $1); print "$b_red$2 $printable$ob\n"; + } elsif ($printable =~ s/^(>\S+<) //) { # i'm messaging someone print "$b_magenta$1 $printable$ob\n"; + } elsif ($printable =~ s/^(enter:|update:|forget:) //) { # something that should be SEEN print "$b_green$1 $printable$ob\n"; + } else { print "$printable\n"; } + } else { - print "VERBOSITY IS OFF?\n"; + #print "VERBOSITY IS OFF?\n"; } # log the line into a file. return unless (&IsParam("logfile")); return unless (defined fileno LOG); - # remove control characters from logging. + # remove control characters from logging to LOGFILE. for ($input) { + last if (&IsParam("logColors")); s/\e\[[0-9;]+m//g; # escape codes. s/[\cA-\c_]//g; # control chars. } @@ -349,9 +350,9 @@ sub status { my $date; if (&IsParam("logType") and $param{'logType'} =~ /DAILY/i) { - $date = sprintf("%02d:%02d.%02d", (localtime $time)[2,1,0]); + $date = sprintf("%02d:%02d.%02d", (gmtime $time)[2,1,0]); - my ($day,$month,$year) = (localtime $time)[3,4,5]; + my ($day,$month,$year) = (gmtime $time)[3,4,5]; my $newlogDate = sprintf("%04d%02d%02d",$year+1900,$month+1,$day); if (defined $logDate and $newlogDate != $logDate) { &closeLog(); @@ -365,9 +366,49 @@ sub status { printf LOG "%s %s\n", $date, $input; } +sub debug_perl { + my ($str) = @_; + + return unless ($str =~ /^WARN: Use of uninitialized value .* at (\S+) line (\d+)/); + my ($file,$line) = ($1,$2); + if (!open(IN,$file)) { + &status("WARN: cannot open $file: $!"); + return; + } + + # TODO: better filename. + open(OUT, ">>debug.log"); + print OUT "DEBUG: $str\n"; + + # note: cannot call external functions because SIG{} does not allow us to. + my $i; + while () { + chop; + $i++; + # bleh. this tries to duplicate status(). + # TODO: statcountfix + # TODO: rename to log_*someshit* + if ($i == $line) { + my $msg = "$file: $i:!$_"; + printf "%s[%6d]%s %s\n", $_green, $statcount, $ob, $msg; + print OUT "DEBUG: $msg\n"; + $statcount++; + next; + } + if ($i+3 > $line && $i-3 < $line) { + my $msg = "$file: $i: $_"; + printf "%s[%6d]%s %s\n", $_green, $statcount, $ob, $msg; + print OUT "DEBUG: $msg\n"; + $statcount++; + } + } + close IN; + close OUT; +} + sub openSQLDebug { if (!open(SQLDEBUG, ">>$param{'SQLDebug'}")) { - &ERROR("cannot open $param{'SQLDebug'}..."); + &ERROR("Cannot open ($param{'SQLDebug'}): $!"); delete $param{'SQLDebug'}; return 0; }