SF.net SVN: logwatch:[335] trunk

[email protected] Sat, 27 Feb 2016 15:01:41 +0000
Newsgroups gmane.comp.log.logwatch.devel
Message-ID <[email protected]>
Revision: 335
          http://sourceforge.net/p/logwatch/code/335
Author:   stefjakobs
Date:     2016-02-27 15:01:41 +0000 (Sat, 27 Feb 2016)
Log Message:
-----------
http-error: apache 2.4 compatible version (needs more testing) (Thanks:
Bjorn)

Modified Paths:
--------------
    trunk/conf/logfiles/http-error.conf
    trunk/conf/services/http-error.conf
    trunk/scripts/services/http-error

Modified: trunk/conf/logfiles/http-error.conf
===================================================================
--- trunk/conf/logfiles/http-error.conf	2016-02-27 14:58:13 UTC (rev 334)
+++ trunk/conf/logfiles/http-error.conf	2016-02-27 15:01:41 UTC (rev 335)
@@ -9,6 +9,7 @@
 LogFile = apache2/*error.log.1
 LogFile = apache2/*error.log
 LogFile = apache2/*error_log
+LogFile = apache2/*error_log_*
 LogFile = apache-ssl/*error.log.1
 LogFile = apache-ssl/*error.log
 
@@ -37,6 +38,6 @@
 # Keep only the lines in the proper date range...
 *ApplyhttpDate
 # or use a custom time filter:
-# *ApplyStdDate = "\[%a %b %d %H:%M:%S %Y\]"
+# *ApplyStdDate = "\[%a %b %d %H:%M:%S.\d{6} %Y\]"
 
 # vi: shiftwidth=3 tabstop=3 et

Modified: trunk/conf/services/http-error.conf
===================================================================
--- trunk/conf/services/http-error.conf	2016-02-27 14:58:13 UTC (rev 334)
+++ trunk/conf/services/http-error.conf	2016-02-27 15:01:41 UTC (rev 335)
@@ -1,20 +1,18 @@
 #
 # Service definition for http error log
 #
-# File to be placed in
-#	/etc/logwatch/conf/services/http-error.conf
-#
 
-Title = http errors
+Title = httpd errors
 
 # Which logfile group...
 LogFile = http-error
 
-# PHP notices should be fixed
-Detail = High
+# The Detail levels are as follows:
+#	0: display number of error-level messages
+#	3: display number of notice, warn, and error messages
+#	5: display number of messages by Apache http code
+#	6: display one example of each code, truncated to fit line
+#	8: display one example of each code, where descriptions are "collapsed"
+#	9: display each message, where descriptions are "collapsed"
+#      10: display each message
 
-# Ignore all "does not exist" messages
-# $ignore_not_exist_all = Yes
-
-# Ignore "does not exist" messages with no "referer:" tag
-# $ignore_not_exist_no_referer = Yes

Modified: trunk/scripts/services/http-error
===================================================================
--- trunk/scripts/services/http-error	2016-02-27 14:58:13 UTC (rev 334)
+++ trunk/scripts/services/http-error	2016-02-27 15:01:41 UTC (rev 335)
@@ -1,17 +1,11 @@
-#!/usr/bin/perl -w
+#!/usr/bin/perl
 #
-# $Id$
-#
-# Logwatch service for http error logs
-# To be placed in 
-#	/etc/logwatch/scripts/http-error
-#
-# Processes all messages and summarizes them
-# Each message is given with a timestamp and RMS
-#
-########################################################
-##(C) 2006 by Jeremias Reith <[email protected]>
-## Modified 2009 by Michael Baierl
+##########################################################################
+# $Id:
+##########################################################################
+# $Log:
+##########################################################################
+## Copyright (c) 2016 Logwatch
 ## Covered under the included MIT/X-Consortium License:
 ##    http://www.opensource.org/licenses/mit-license.php
 ## All modifications and contributions by other persons to
@@ -24,129 +18,80 @@
 ## contributions.  If you have made significant
 ## contributions to this script and want to claim
 ## copyright please contact [email protected]
-######################################################### 
+##########################################################################
 
+use diagnostics;
 use strict;
-use Logwatch ':dates';
-use Time::Local;
-use POSIX qw(strftime);
 
-my $date_format = '... %b %d %H:%M:%S %Y';
-my $filter = TimeFilter($date_format);
-my $detail = exists $ENV{'LOGWATCH_DETAIL_LEVEL'} ? $ENV{'LOGWATCH_DETAIL_LEVEL'} : 0;
-my $Ignore_not_exist_all = $ENV{'ignore_not_exist_all'} || 0;
-my $Ignore_not_exist_no_referer = $ENV{'ignore_not_exist_no_referer'} || 0;
+my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;
 
-# we do not use any Date:: package (or strptime) as they are probably not available
-my %month2num = ( Jan => 0, Feb => 1, Mar => 2, Apr => 3,
-		  May => 4, Jun => 5, Jul => 6, Aug => 7,
-		  Sep => 8, Oct => 9, Nov => 10, Dec => 11 );
+sub CustomizeErrorString {
+   my ($LogLevel, $ErrorCode, $Description) = @_;
+   # This function is only invoked when detail is set to 8 or 9.
+   # Here you would modify the Description.  Some Description strings
+   # may differ only on some printed parameters, and it is preferable
+   # to group them together.  Examples of these may be process numbers,
+   # IP addresses, port numbers, or file names.  The purpose of this
+   # function is to "collapse" these different messages into the same
+   # array entry.
 
-# array of message categories (we do not use a hash to keep the order)
-# first element: catorory name 
-# second element: matching regexp ($1 should contain the message)
-# third element: anonymous hash ref (stores message  counts)
-my @message_categories = (['Errors', qr/\[error\] (.*)$/o, {}],
-			  ['Warnings', qr/\[warn\] (.*)$/o, {}],
-			  ['Notices', qr/\[info\] (.*)$/o, {}]);
+   # For now, simply return the string.
+   return($Description);
+}
 
-# skipping categories depending on detail level
-pop(@message_categories) if $detail < 10;
-pop(@message_categories) if $detail < 5;
+my %LogMessages = ();
 
-# counting messages
-while(<>) {
-    my $line = $_;
-    # skip PHP messages (have a separate script)
-    next if $line =~ / PHP (Warning|Fatal error|Notice):/o;
-    # Ignore does not exist messages if asked
-    if ($line =~ /does not exist:/o) {
-       next if $Ignore_not_exist_all;
-       next if $Ignore_not_exist_no_referer and $line !~ /, referer: /o;
-    }
-    # skipping messages that are not within the requested range
-    next unless $line =~ /^\[($filter)\]/o;
-    $1 =~ /(\w+) (\w+) (\d+) (\d+):(\d+):(\d+) (\d+)/;
-    my $time;
-
-    {
-	# timelocal is quite chatty
-	local $SIG{'__WARN__'}  = sub {};
-	$time = timelocal($6, $5, $4, $3, $month2num{$2}, $7-1900);
-    }
-
-    foreach my $cur_cat (@message_categories) {
-	if($line =~ /$cur_cat->[1]/) {
-	    my $msgs = $cur_cat->[2];
-	    $msgs->{$1} = {count => '0',
-			   first_occurrence => $time,
-			   sum => 0, 
-			   sqrsum => 0} unless exists $msgs->{$1};
-	    $msgs->{$1}->{'count'}++;
-	    # summing up timestamps and squares of timestamps
-	    # in order to calculate the rms
-	    # using first occurrence of message as offset in calculation to 
-	    # prevent an integer overflow
-	    $msgs->{$1}->{'sum'} += $time - $msgs->{$1}->{'first_occurrence'};
-	    $msgs->{$1}->{'sqrsum'} += ($time - $msgs->{$1}->{'first_occurrence'}) ** 2;
-	    last;
-	}
-    }
+while (defined(my $ThisLine = <STDIN>)) {
+   if (my ($LogLevel, $ErrorCode, $Description) = ($ThisLine =~ /:(notice|warn|error)\].*(AH\d{5}): (.*)/) ) {
+      if (($Detail == 8) || ($Detail == 9)) {
+         $Description = CustomizeErrorString($LogLevel, $ErrorCode, $Description);
+      }
+      if (($Detail >= 1) || ($LogLevel =~ "error")) {
+         $LogMessages{$LogLevel}{$ErrorCode}{$Description}++;
+      }
+   }
 }
 
+if (keys %LogMessages) {
+   my $Count = 0;
+   foreach my $LogLevel (keys %LogMessages) {
+      printf("\nLevel %-6s", $LogLevel);
+      foreach my $ErrorCode (keys %{$LogMessages{$LogLevel}}) {
+         print "\n   Error Code: $ErrorCode" if $Detail >= 5;
+         foreach my $Description (keys %{$LogMessages{$LogLevel}{$ErrorCode}}) {
+            if ($Detail >= 9) {
+               print "\n      $Description:  ";
+               print "$LogMessages{$LogLevel}{$ErrorCode}{$Description} Time(s)";
+            }
+            $Count += $LogMessages{$LogLevel}{$ErrorCode}{$Description};
+         } # foreach $Description
+         if (($Detail >= 5) && ($Detail < 9)) { 
+            printf(":  %5d Time(s)", $Count);
+            $Count = 0;
+            if ($Detail >=6) {
+               print "\n      E.g.: ";
+               # print only first entry (index 0)
+               my $EG_string = (keys %{$LogMessages{$LogLevel}{$ErrorCode}})[0];
+               if (($Detail == 6) && (length($EG_string) > 66)) {
+                  printf ("%.62s ...", $EG_string);
+               } else {
+                  print $EG_string;
+               }
+            }
+         }
+      } # foreach $ErrorCode
+      if ($Detail < 5) { 
+         printf("%s%5d%s", ":  ", $Count, " Time(s)");
+         $Count = 0;
+      }
+   } # foreach $LogLevel
+} # if keys %LogMessages
 
-# generating summary
-foreach my $cur_cat (@message_categories) {
-    # skipping non-requested message types
-    next unless keys %{$cur_cat->[2]};
-    my ($name, undef, $msgs) = @{$cur_cat};
-    print $name, ":\n";
-    my $last_count = 0;
+exit(0);
 
-    # sorting messages by count
-    my @sorted_msgs = sort { $msgs->{$b}->{'count'} <=> $msgs->{$a}->{'count'} } keys %{$msgs};
-
-    foreach my $msg (@sorted_msgs) {
-	# grouping messages by number of occurrence
-	print "\n", $msgs->{$msg}->{'count'}, " times:\n" unless $last_count == $msgs->{$msg}->{'count'};   
-	my $rms = 0;
-
-
-	# printing timestamp
-        print '[';
-
-	if($msgs->{$msg}->{'count'} > 1) {
-	    # calculating rms
-	    $rms = int(sqrt(
-			   ($msgs->{$msg}->{'count'} * 
-			    $msgs->{$msg}->{'sqrsum'} - 
-			    $msgs->{$msg}->{'sum'}) / 
-			   ($msgs->{$msg}->{'count'} * 
-			    ($msgs->{$msg}->{'count'} - 1))));
-
-	    print strftime($date_format, localtime($msgs->{$msg}->{'first_occurrence'}+int($rms/2)));
-
-	    print ' +/-';
-	    
-	    # printing rms
-	    if($rms > 86400) {
-		print int($rms/86400) , ' day(s)';
-	    } elsif($rms > 3600) {
-		print int($rms/3600) , ' hour(s)';
-	    } elsif($rms > 60) {
-		print int($rms/60) , ' minute(s)';
-	    } else {
-		print $rms, ' seconds';
-	    }
-	} else {
-	    # we have got this message a single time
-	    print strftime($date_format, localtime($msgs->{$msg}->{'first_occurrence'}));
-	}
-	   
-	print '] ', $msg, "\n";	
-	$last_count = $msgs->{$msg}->{'count'};
-    }
-
-    print "\n";
-}
-
+# vi: shiftwidth=3 tabstop=3 syntax=perl et
+# Local Variables:
+# mode: perl
+# perl-indent-level: 3
+# indent-tabs-mode: nil
+# End:

This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.


------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140