File: http-error

package info (click to toggle)
logwatch 7.14-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,572 kB
  • sloc: perl: 8,290; sh: 354; makefile: 38
file content (124 lines) | stat: -rw-r--r-- 4,657 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

########################################################
# Please file all bug reports, patches, and feature
# requests under:
#      https://sourceforge.net/p/logwatch/_list/tickets
# Help requests and discusion can be filed under:
#      https://sourceforge.net/p/logwatch/discussion/
########################################################

#
##########################################################################
## 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
## this script are assumed to have been donated to the
## Logwatch project and thus assume the above copyright
## and licensing terms.  If you want to make contributions
## under your own copyright or a different license this
## must be explicitly stated in the contribution an the
## Logwatch project reserves the right to not accept such
## contributions.  If you have made significant
## contributions to this script and want to claim
## copyright please contact logwatch-devel@lists.sourceforge.net.
##########################################################################

use diagnostics;
use strict;

my $Detail = $ENV{'LOGWATCH_DETAIL_LEVEL'} || 0;

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.

   # For now, simply return the string.
   return($Description);
}

my %LogMessages = ();
my $MatchFilter = $ENV{'http_error_matchfilter'} || "";
my $ReportFilter = $ENV{'http_error_reportfilter'} || "";

while (defined(my $ThisLine = <STDIN>)) {
   if (my ($LogLevel, $ErrorCode, $Description) =
      ($ThisLine =~ /:(.*?)\].*(AH\d{5}): (.*)/) ) {
   # $MatchFilter is a variable that is set by setting the
   # $HTTP_Error_MatchFilter variable in the conf/services/http-error.conf
   # file.  It is executed here, before any other matching statements.
   eval $MatchFilter;
   if ($@) {
      print $@;
      print "While processing MatchFilter:\n$MatchFilter\n";
   }
   # $ThisLine might have been reset (undef, or empty string) in $MatchFilter
   next unless $ThisLine;

      if (($Detail == 8) || ($Detail == 9)) {
         $Description = CustomizeErrorString($LogLevel, $ErrorCode, $Description);
      }
      if (($Detail >= 1) || ($LogLevel =~ "emerg|alert|crit|error")) {
         $LogMessages{$LogLevel}{$ErrorCode}{$Description}++;
      }
   }
}

# $ReportFilter is a variable that is set by setting the
# $HTTP_Error_ReportFilter variable in the conf/services/http-error.conf
# file.  It is executed here, before any other printing statements.
eval $ReportFilter;
if ($@) {
   print $@;
   print "While processing ReportFilter:\n$ReportFilter\n";
}

if (keys %LogMessages) {
   my $Count = 0;
   foreach my $LogLevel (keys %LogMessages) {
      printf("\nLevel %-6s", $LogLevel);
      foreach my $ErrorCode (keys %{$LogMessages{$LogLevel}}) {
         print "\n   $LogLevel 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

exit(0);

# vi: shiftwidth=3 tabstop=3 syntax=perl et
# Local Variables:
# mode: perl
# perl-indent-level: 3
# indent-tabs-mode: nil
# End: