You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by he...@apache.org on 2019/06/08 06:59:21 UTC

svn commit: r1860806 - in /spamassassin/branches/3.4/lib/Mail/SpamAssassin: Logger.pm Logger/File.pm Logger/Stderr.pm Logger/Syslog.pm

Author: hege
Date: Sat Jun  8 06:59:21 2019
New Revision: 1860806

URL: http://svn.apache.org/viewvc?rev=1860806&view=rev
Log:
Commit log suppressor from trunk

Modified:
    spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger.pm
    spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/File.pm
    spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Stderr.pm
    spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Syslog.pm

Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger.pm?rev=1860806&r1=1860805&r2=1860806&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger.pm Sat Jun  8 06:59:21 2019
@@ -41,6 +41,7 @@ use warnings;
 use re 'taint';
 
 use Exporter ();
+use Time::HiRes ();
 
 our @ISA = qw(Exporter);
 our @EXPORT = qw(dbg info would_log);
@@ -61,6 +62,11 @@ my %log_level = (
 # global shared object
 our %LOG_SA;
 our $LOG_ENTERED;  # to avoid recursion on die or warn from within logging
+# duplicate message line suppressor
+our $LOG_DUPMIN = 10; # only start suppressing after x duplicate lines
+our $LOG_DUPLINE = ''; # remembers last log line
+our $LOG_DUPTIME; # remembers last log line timestamp
+our $LOG_DUPCNT = 0; # counts duplicates
 
 # defaults
 $LOG_SA{level} = WARNING;       # log info, warnings and errors
@@ -152,7 +158,7 @@ sub log_message {
 
   if ($level eq "error") {
     # don't log alarm timeouts or broken pipes of various plugins' network checks
-    return if ($message[0] =~ /__ignore__/);
+    return if (index($message[0], '__ignore__') != -1);
 
     # dos: we can safely ignore any die's that we eval'd in our own modules so
     # don't log them -- this is caller 0, the use'ing package is 1, the eval is 2
@@ -168,6 +174,29 @@ sub log_message {
   my $message = join(" ", @message);
   $message =~ s/[\r\n]+$//;		# remove any trailing newlines
 
+  my $now = Time::HiRes::time;
+
+  # suppress duplicate loglines
+  if ($message eq $LOG_DUPLINE) {
+    $LOG_DUPCNT++;
+    $LOG_DUPTIME = $now;
+    # only start suppressing after x identical lines
+    if ($LOG_DUPCNT >= $LOG_DUPMIN) {
+      $LOG_ENTERED = 0;
+      return;
+    }
+  } else {
+    if ($LOG_DUPCNT >= $LOG_DUPMIN) {
+      $LOG_DUPCNT -= $LOG_DUPMIN - 1;
+      my $dupmsg = $LOG_DUPCNT > 1 ? " [... logline repeated $LOG_DUPCNT times]" : "";
+      while (my ($name, $object) = each %{ $LOG_SA{method} }) {
+        $object->log_message($level, "$LOG_DUPLINE$dupmsg", $LOG_DUPTIME);
+      }
+    }
+    $LOG_DUPCNT = 0;
+    $LOG_DUPLINE = $message;
+  }
+
   # split on newlines and call log_message multiple times; saves
   # the subclasses having to understand multi-line logs
   my $first = 1;
@@ -182,7 +211,7 @@ sub log_message {
       $line =~ s/^([^:]+?):/$1: [...]/;
     }
     while (my ($name, $object) = each %{ $LOG_SA{method} }) {
-      $object->log_message($level, $line);
+      $object->log_message($level, $line, $now);
     }
   }
   $LOG_ENTERED = 0;
@@ -334,17 +363,17 @@ The facility argument is optional.
 sub would_log {
   my ($level, $facility) = @_;
 
-  if ($level eq "info") {
-    return $LOG_SA{level} >= INFO;
-  }
-  if ($level eq "dbg") {
+  if ($level eq 'dbg') {
     return 0 if $LOG_SA{level} < DBG;
     return 1 if !$facility;
     return ($LOG_SA{facility}->{$facility} ? 2 : 0)
       if exists $LOG_SA{facility}->{$facility};
     return 1 if $LOG_SA{facility}->{all};
     return 0;
+  } elsif ($level eq 'info') {
+    return $LOG_SA{level} >= INFO;
   }
+
   warn "logger: would_log called with unknown level: $level\n";
   return 0;
 }

Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/File.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/File.pm?rev=1860806&r1=1860805&r2=1860806&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/File.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/File.pm Sat Jun  8 06:59:21 2019
@@ -87,16 +87,17 @@ sub init {
 }
 
 sub log_message {
-  my ($self, $level, $msg) = @_;
+  my ($self, $level, $msg, $ts) = @_;
 
   my $timestamp;
   my $fmt = $self->{timestamp_fmt};
+  my $now = defined $ts ? $ts : Time::HiRes::time;
   if (!defined $fmt) {
-    $timestamp = scalar localtime;  # default, backward compatibility
+    $timestamp = scalar localtime($now);  # default, backward compatibility
   } elsif ($fmt eq '') {
     $timestamp = '';
   } else {
-    $timestamp = POSIX::strftime($fmt, localtime(Time::HiRes::time));
+    $timestamp = POSIX::strftime($fmt, localtime($now));
   }
   $timestamp .= ' '  if $timestamp ne '';
 

Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Stderr.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Stderr.pm?rev=1860806&r1=1860805&r2=1860806&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Stderr.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Stderr.pm Sat Jun  8 06:59:21 2019
@@ -64,13 +64,13 @@ sub new {
 }
 
 sub log_message {
-  my ($self, $level, $msg) = @_;
+  my ($self, $level, $msg, $ts) = @_;
 
   my $timestamp;
   my $fmt = $self->{timestamp_fmt};
+  my $now = defined $ts ? $ts : Time::HiRes::time;
   if (!defined $fmt) {
     # default since 3.3.0
-    my $now = Time::HiRes::time;
     my $datetime = POSIX::strftime("%b %d %H:%M", localtime($now));
     utf8::encode($datetime)  if utf8::is_utf8($datetime);  # Bug 7305
     $timestamp = sprintf("%s:%06.3f", $datetime, $now-int($now/60)*60);
@@ -79,7 +79,7 @@ sub log_message {
   } elsif ($fmt eq '') {
     $timestamp = '';
   } else {
-    $timestamp = POSIX::strftime($fmt, localtime(Time::HiRes::time));
+    $timestamp = POSIX::strftime($fmt, localtime($now));
   }
   $timestamp .= ' '  if $timestamp ne '';
 

Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Syslog.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Syslog.pm?rev=1860806&r1=1860805&r2=1860806&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Syslog.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Logger/Syslog.pm Sat Jun  8 06:59:21 2019
@@ -137,7 +137,7 @@ sub init {
 }
 
 sub log_message {
-  my ($self, $level, $msg) = @_;
+  my ($self, $level, $msg, $ts) = @_;
 
   return if $self->{disabled};
 
@@ -160,7 +160,8 @@ sub log_message {
   my $timestamp = '';
   my $fmt = $self->{timestamp_fmt};
   if (defined $fmt && $fmt ne '') {  # for completeness, rarely used
-    $timestamp = POSIX::strftime($fmt, localtime(Time::HiRes::time));
+    my $now = defined $ts ? $ts : Time::HiRes::time;
+    $timestamp = POSIX::strftime($fmt, localtime($now));
   }
   $msg = $timestamp . ' ' . $msg  if $timestamp ne '';