diff common/logwatch/scripts_mysql @ 0:956e484adc12

Initial public release of Puppet configs
author IBBoard <dev@ibboard.co.uk>
date Sat, 16 Aug 2014 19:47:38 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/logwatch/scripts_mysql	Sat Aug 16 19:47:38 2014 +0000
@@ -0,0 +1,126 @@
+#!/usr/bin/perl -w
+#
+# $Id$
+#
+# Logwatch service for mysqld error log
+# To be placed in 
+#	/etc/logwatch/scripts/mysql
+#
+# Processes all messages and summarizes them
+# Each message is given with a timestamp and RMS
+#
+# (C) 2006 by Jeremias Reith <jr@terragate.net>
+# Modified 2009 by Michael Baierl
+
+
+use strict;
+use Logwatch ':dates';
+use Time::Local;
+use POSIX qw(strftime);
+
+my $date_format = '%y%m%d %H:%M:%S';
+my $filter = TimeFilter($date_format);
+my $detail = exists $ENV{'LOGWATCH_DETAIL_LEVEL'} ? $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 );
+
+# 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, {}],
+			  ['Note', qr/\[Note\] (.*)$/o, {}],
+			  ['Other', qr/(.*)$/o, {}]);
+
+# counting messages
+while(<>) {
+    my $line = $_;
+    # skipping messages that are not within the requested range
+    next unless $line =~ /^($filter)/o;
+    $1 =~ /(\d\d)(\d\d)(\d\d)\s+(\d+):(\d+):(\d+)/;
+    my $time;
+
+    {
+	# timelocal is quite chatty
+	local $SIG{'__WARN__'}  = sub {};
+	$time = timelocal($6, $5, $4, $3, $2-1, $1);
+    }
+
+    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;
+	}
+    }
+}
+
+
+# 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;
+
+    # 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";
+}
+