środa, 6 lutego 2013

Analiza logów Postfiksa przy pomocy logwatch oraz postfix-logwatch

Mimo próśb, błagań, krzyków na monitor i krwawych ofiar składanych w blasku księżyca, program postfix-logwatch niewzruszenie odmawia dukowania statystyk z pliku logu. Jeśli macie ten sam problem, zapewne logujecie informacje z datą w formacie ISO. Ani postfix-logwatch, ani logwatch nie rozumieją tego formatu, w związku z czym odrzucają wszystkie wpisy, bez ich analizowania.


Zła wiadomość jest taka, że prawdopodobnie nie doczekamy się wsparcia dla dat ISO w tych programach. Problem jest znany od jakiegoś czasu, a jedyna informacja od twórców brzmi mniej więcej "wiemy, do zobaczenia i dzięki za ryby". Trzeba zatem zakasać rękawy i poprawić programy samemu. I tutaj pojawia się wiadomość przerażająca - oba narzędzia napisane są w Perlu. Tak, w tym języku luźno wzorowanym na /dev/urandom. Zanim jednak rozpoczniecie ciche popłakiwanie w kącie, rozweselę Was nieco podając gotowe rozwiązanie.

W przypadku postfix-logwatch poprawka jest banalnie prosta. Wystarczy nałożyć poniższy patch:

--- postfix-logwatch-1.40.00.orig/postfix-logwatch 2012-01-12 01:22:25.000000000 +0100
+++ postfix-logwatch-1.40.00/postfix-logwatch 2013-02-06 14:37:24.970844035 +0100
@@ -2700,7 +2700,7 @@
    #          Aug 17 15:16:12 mailhost postfix/cleanup[14194]: [ID 197553 mail.info] EC2B339E5: message-id=<2616.EC2B339E5@example.com>
    #          Dec 25 05:20:28 mailhost policyd-spf[14194]: [ID 27553 mail.info] ... policyd-spf stuff ...
 
-   next unless /^[A-Z][a-z]{2} [ \d]\d \d{2}:\d{2}:\d{2} (?:<[^>]+> )?(\S+) ($Opts{'syslog_name'}(?:\/([^:[]+))?)(?:\[\d+\])?: (?:\[ID \d+ \w+\.\w+\] )?(.*)$/o;
+   next unless /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+\+\d{2}:\d{2} (?:<[^>]+> )?(\S+) ($Opts{'syslog_name'}(?:\/([^:[]+))?)(?:\[\d+\])?: (?:\[ID \d+ \w+\.\w+\] )?(.*)$/o;
 
    our $service_name = $3;
    my ($mailhost,$server_name,$p1) = ($1,$2,$4);

Z logwatch niestety już nie jest tak różowo. Naszą przygodę z poprawianiem tego programu zaczniemy od utworzenia pliku ${BaseDir}/scripts/logfiles/maillog/applydate o zawartości:

use POSIX qw(strftime);
use Logwatch ':dates';

my $time = time;
my $Debug = $ENV{'LOGWATCH_DEBUG'} || 0;

$SearchDate = TimeFilter('%Y-%m-%dT%H:%M:%S\.\d+\+\d{2}:\d{2} ');

if ($Debug > 5) {
   print STDERR "DEBUG: Inside ApplyDate (maillog)...\n";
   print STDERR "DEBUG: Looking For: $SearchDate or $SearchYear\n";
}

while (defined($ThisLine = )) {
   if ($ThisLine =~ s/$SearchDate//o) {
      print $ThisLine;
   }
}

Dodatkowo trzeba zmodyfikować dwa pliki: ${BaseDir}/scripts/shared/onlyservice:

--- onlyservice.orig 2013-02-06 15:52:36.538142311 +0100
+++ onlyservice 2013-02-06 15:45:36.814983757 +0100
@@ -34,6 +34,9 @@
     elsif ($ThisLine =~ m/^... .. ..:..:.. [^ ]* [^ ]*(\[[0123456789]*\])?: \[ID [0-9]+ $ServiceName/io) {
       print $ThisLine;
     }
+    elsif ($ThisLine =~ m/^[ ]*[^ ]* $ServiceName(\[[0123456789]*\])?:? /io) {
+      print $ThisLine;
+    }
 }
 
 # vi: shiftwidth=3 syntax=perl tabstop=3 et

oraz ${BaseDir}/default.conf/logfiles/maillog.conf:

--- maillog.conf.orig 2013-02-06 15:55:55.643434032 +0100
+++ maillog.conf 2013-02-06 15:21:03.075771229 +0100
@@ -34,6 +34,6 @@
 *ExpandRepeats
 
 # Keep only the lines in the proper date range...
-*ApplyStdDate
+#*ApplyStdDate
 
 # vi: shiftwidth=3 tabstop=3 et

Po takich zabiegach logwatch powinien już sobie bez problemu radzić z datami ISO w logach Postfiksa.

Brak komentarzy:

Prześlij komentarz

Uwaga. Komentarze są moderowane i mogą nie pojawić się natychmiast po utworzeniu. Autor niniejszego bloga zastrzega sobie prawo do niedopuszczenia komentarzy będących SPAMem i/lub nie odnoszących się do komentowanego wpisu i/lub łamiących zasady kulturalnej wymiany opinii.