2011-11-19 11 views
15

Sto tentando di utilizzare il modulo logging di Python per inviare e-mail contenenti i registri. Il problema che sto avendo è che ogni volta che scrivo una voce di log, viene inviata un'email. Come faccio ad accodare i messaggi di log e inviare una singola email al termine dello script?SMTPHandler nel modulo di registrazione di Python che invia email una alla volta. Come posso fermarlo?

Ho la sensazione che sia fatto con il metodo emit(), ma non riesco a capire come usarlo.

import logging, logging.handlers 
log = logging.getLogger("mylogger") 
log.setLevel(logging.DEBUG) 
h2 = logging.handlers.SMTPHandler(mailhost='mailserver', 
          fromaddr='[email protected]', 
          toaddrs=['[email protected]'], 
          subject='The log', 
          credentials=('user','pwd'), 
          secure=None) 
h2.setLevel(logging.INFO) 
h2.setFormatter(f) 
log.addHandler(h2) 

log.info("Did something") 
log.info("Did something else") 
log.info("This would send a third email. :-(") 

risposta

8

Vedi this answer che ho dato per una domanda simile un gestore di esempio per l'uso è here, è possibile adattarlo alle proprie esigenze

+0

@VinaySajip - quali sono i tuoi pensieri su utilizzando il modulo smtplib per inviare messaggi di posta elettronica, invece.. ? – codingknob

+0

@ algotr8der - È possibile vedere dal gestore di esempio che effettivamente usa 'smtplib' per inviare le e-mail. –

2

Sottoclasse semplicemente SMTPHandler per produrre il comportamento desiderato. è possibile, ad esempio, sovrascrivere il metodo emit per inviare una posta ogni terzo messaggio registrato

Attenzione: in base all'implementazione scelta non verrà inviata alcuna posta se si registra solo una o due volte. Forse un invio ritardato potrebbe essere la soluzione: aspetta un secondo prima di inviare la posta. Se dopo un secondo non viene ricevuta alcuna altra riga, quindi inviarla, aggiungere la riga al messaggio da inviare e attendere un altro secondo ... e così via ... (L'invio differito deve essere fatto in un thread separato (considerare l'utilizzo di Timer)

Problemi correlati