Durchsuche Maillog nach Suchstring (z.B. Teil einer Mailadresse), zeige alle Logeinträge mit der passenden Message-ID.
Klappt bei allen sendmail-kompatiblen Logs, zum Beispiel auch Postfix.
#!/usr/bin/perl # Aufruf: # mailgrep suchbegriff maillogdatei # oder # mailgrep suchbegriff (INPUT STDIN) # Durchsucht maillog nach suchbegriff und gibt # Zeilen mit passender mail-id aus # Hella Breitkopf 2003-02-19, www.unixwitch.de # kleine Aenderungen (statusmeldungen) 2007-10-09 @oldbuffer=""; # OLDBUFFERSIZE # Bei Fund des Suchbegriffs wird so viele Zeilen in der # Vergangenheit des Logfiles nach zutreffenden Mailids gesucht $OLDBUFFERSIZE=50; # messageidregex # rollierender Mailid-Buffer # (wenn leer, werden erst mal alle Mails gefunden, # deswegen Vorfuellung mit XXXX... ) $messageidregex="XXXXXXXXXXXXXXX"; # MAXINTERLEAVE; # Groesse des "rollierenden Mailid-Buffers" # (je groesser, desto mehr Treffer - auch falsche, wenn die Mailids # recycled werden) # (( Anmerkung 2003-03-06: bei sendmail 8.12.8 sind die IDs laenger # und werden deswegen vermutlich seltener recycled )) # Erhoehung dieses Werts kostet Zeit $MAXINTERLEAVE=3; $suchbegriff=$ARGV[0]; # kein Dateiname -> input von stdin if (! $ARGV[1]) { $ARGV[1] = "STDIN"; } $dateiname=$ARGV[1]; if ($dateiname ne "STDIN" && ! open(NEUEDATEI,$dateiname)) { die "Kann Datei $dateiname nicht oeffnen: $!\n"; } else { $DATEI = $dateiname eq "STDIN" ? STDIN : NEUEDATEI; } while ( <$DATEI> ) { # neue zeile in den Buffer, aelteste Zeile hinten rauswerfen push @oldbuffer,$_ ; if ( $#oldbuffer > $OLDBUFFERSIZE ) { $garbage = shift @oldbuffer }; if ( /$suchbegriff/ ) { # die message id steht an 6ter Stelle - so lange sie vom Mailserver # verarbeitet wird, kann man die Mail daran identifizieren $messageid = (split /\s+/ )[5]; # wenn die message-id noch nicht bekannt ist, haben wir eine neue # mail-transaktion mit dem Suchbegriff gefunden # es kommt aber auch vor, dass im 6ten Feld gar keine message-id # sondern irgendeine statusmeldung steht ... if (not( $messageid =~ /$messageidregex/ ) and not ( $messageid =~ /NOQUEUE/) and not ( $messageid =~ /connect/) and not ( $messageid =~ /disconnect/) and not ( $messageid =~ /warning/) and not ( $messageid =~ /Greylist/) and not ( $messageid =~ /lost/) ) { print " \n --- Aktuelle Message-ID: $messageid -- "; print " RegEx der zu suchenden Message-IDs: $messageidregex \n"; #Die gefundene Messageid an die Messageid-suchliste #anhaengen $messageidregex .= "|" . $messageid; # Wenn die Messageid-Suchliste zu lange ist, den aeltesten # Eintrag rauswerfen @messageidlist = ( split /\|/ , $messageidregex ); if ($#messageidlist >= $MAXINTERLEAVE ) { $garbage = shift @messageidlist; #print "===> $messageidlist[0] $messageidlist[2] <===\n"; $messageidregex = join '|' , @messageidlist } # suche, ob wir im vorher eingelesenen Buffer #eine passende message id finden foreach $oldline (@oldbuffer) { print "<| $oldline" if ($oldline =~ /$messageid/); } # bei neuem match ist die gefundene Zeile auch im oldbuffer und # wurde schon gedruckt } else # message id schon bekannt oder statusmeldung { #drucke gefundene Zeile print "=| $_"; } } else # suchbegriff ist nicht enthalten, # aber vielleicht finden wir ja eine schon bekannte message-id { if ( /$messageidregex/ ) { print ">| $_"} } };
gilt für alle Tipps, Tricks & Spickzettel:
dies sind einfache, teils banale Notizen für meinen persönlichen Gebrauch,
die hier eher zufällig auch öffentlich lesbar sind
(vielleicht hilft es ja jemandem weiter). Verwendung auf eigene Gefahr
Fehler-Hinweise, Dankesschreiben , etc. bitte an: web.21@unixwitch.de
weitere Tools / Spickzettel