elaborazione Postfix log con python

1

Ho bisogno di elaborare tutti i messaggi di log da Postfix ( /var/log/mail/mail.log ), e stampare un sommario / statistiche (quante email sono state inviate / ricevute e da / a quali indirizzi email)

La situazione è resa più complicata dal fatto che Postfix ha voci di registro su più righe (al contrario, Apache , ad esempio, ha voci a riga singola e l'attività sarebbe stata molto più semplice).

Un log di Postfix di esempio potrebbe avere un aspetto simile al seguente:

2013-12-03 14:40:45  postfix:  6F1AA10B: client=unknown[64.12.143.81]
2013-12-03 14:40:45  postfix:  6F1AA10B: message-id=<[email protected]>
2013-12-03 14:40:45  postfix:  6F1AA10B: from=<[email protected]>, size=1571, nrcpt=1 (queue active)
2013-12-03 14:40:45  postfix:  6F1AA10B: to=<[email protected]>, relay=local, delay=0.13, delays=0.13
2013-12-03 14:40:45  postfix:  6F1AA10B: removed

2013-12-03 14:52:07  postfix:  9DD9610B: client=unknown[209.85.219.65]
2013-12-03 14:52:07  postfix:  9DD9610B: message-id=<[email protected]>
2013-12-03 14:52:07  postfix:  9DD9610B: from=<[email protected]>, size=2388, nrcpt=1 (queue active)
2013-12-03 14:52:07  postfix:  9DD9610B: to=<[email protected]>, orig_to=<[email protected]>, relay=local
2013-12-03 14:52:07  postfix:  9DD9610B: removed

Ogni messaggio di posta elettronica elaborato da Postfix ha un ID messaggio univoco (nel mio esempio 6F1AA10B ).

Quale sarebbe l'approccio migliore per elaborare i log in Python? Quale struttura dati consiglieresti di utilizzare per l'archiviazione delle voci?

    
posta Martin Vegter 14.12.2013 - 14:07
fonte

1 risposta

2

Il modo in cui memorizzi i tuoi oggetti dipende da come li stai elaborando ulteriormente; L'aggregazione in memoria è molto diversa dall'archiviazione di singoli elementi in righe in un database SQL, ad esempio.

L'analisi può essere eseguita raggruppando i record su un elemento specifico nella linea. Presumibilmente un evento per un determinato ID messaggio può estendersi su più timestamp, ma può analizzare le righe in un dizionario, quindi usare itertools.groupby() per raggruppare le righe analizzate.

Non entrerò nella linea analizzando se stesso, ma se assumiamo che un dizionario sia prodotto con una chiave msgid puoi fare:

from itertools import groupby
from operator import itemgetter

for msgid, messages in groupby(parsed_lines, key=itemgetter('msgid')):
    for message in messages:
        # Each 'message' is a dictionary where the 'msgid' is the same
    
risposta data 14.12.2013 - 15:10
fonte

Leggi altre domande sui tag