Um die Logdateien von Postfix auszuwerten und auch noch grafisch schön aufzubereiten eignet sich AWStats hervorragend. AWStats bringt auch mit maillogconvert.pl ein Perlscript für die Konvertierung von Maillogs von diversen Mailserrvern mit um die Mailserver Logfiles auswerten zu können. Unter Ubuntu in Kombination mit Avamis klappt nun nach der Umstellung zur aktuellsten Version Edgy Eft die Auswertung nicht mehr richtig: Das Perlscript findet nur noch alle fehlgeschlagenen Emails, jedoch keine welche erfolgreich versendet wurden (SMTP Status 250). Da das Script durch die Unterstützung diverser Mailserver ziemlich gross ist und ich auch kein Perl-Fan, habe ich mir selber ein kleines Script für die Konvertierung in Ruby geschrieben:
#!/usr/bin/env ruby
# Converts a postfix log file into awstats mailserver log
# Author: Michael Kessler
# No rights reserved
require 'date'
senders = Hash.new
mailservers = Hash.new
year = Time.now.strftime(" %Y")
for line in STDIN.read.split("\n") do
#rejected messages with full qualified hostname of mailserver
if line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).*NOQUEUE.*RCPT from ((?:[-a-z0-9]+\.)+[a-z]{2,})\[.*\]: (\d\d\d).*from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>/
puts “#{Date.parse($1 + year).strftime(’%Y-%m-%d’)} #{$2} #{$5} #{$6} #{$3} - SMTP - #{$4} ?”
#rejected messages with only ip address of mailserver
elsif line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).*NOQUEUE.*RCPT from unknown\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\]: (\d\d\d).*from=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>/
puts “#{Date.parse($1 + year).strftime(’%Y-%m-%d’)} #{$2} #{$5} #{$6} #{$3} - SMTP - #{$4} ?”
#amavis passed email, get sender for accepted messages
elsif line =~ /^.*amavis.* Passed.*<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})> -> <.* queued_as: (\w+),/
senders.store($2,$1)
#connected mailserver with full qualified hostname
elsif line =~ /^.*postfix\/smtpd\[\d+\]: (\w+): client=((?:[-a-z0-9]+\.)+[a-z]{2,})\[.*\]/
mailservers.store($1,$2)
#connected mailserver with only ip address
elsif line =~ /^.*postfix\/smtpd\[\d+\]: (\w+): client=unknown\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?\]/
mailservers.store($1,$2)
#accepted messages
elsif line =~ /^(\w\w\w [\d\s]\d) (\d\d:\d\d:\d\d).* (\w+): to=<([^@\s]+@(?:[-a-z0-9]+\.)+[a-z]{2,})>.* queued as (\w+)/
puts “#{Date.parse($1 + year).strftime(’%Y-%m-%d’)} #{$2} #{senders.fetch($5,’unknown’)} #{$4} #{mailservers.fetch($3,’unknown’)} - SMTP - 250 ?”
end
end
Das Problem mit den gesendeten Emails ist, dass die benötigten Informationen nicht auf einer Logzeile zu finden sind. Desshalb müssen diese Vorgängig geparst werden und anhand der Message-ID beim Senden angereichert werden. Dies kann bei einer täglichen Rotation der Logdateien auch dazu führen, dass nicht alle Informationen in der gleichen Logdatei zu finden ist.
Das Script sieht auf den ersten Blick nicht wirklich lesbarer als ein Perl Script aus, was jedoch an den langen regulären Ausdrücken liegt und nicht an Ruby. Das Script wird übrigens genau gleich wie maillogconvert.pl in die AWStats Konfiguration eingebunden.
Kommentare
gph, michi, Jacko_Momocini, michi, Jacko_Momocini [...]
Stephan, benjie, Florian, Peter, peter pan [...]
michi, flöschen
michi, Golfplätze Schweiz, michi, Blankster, michi [...]
michi, Christian, michi, michi, Lukas Eppler