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