2012-02-10 7 views
6

Estoy usando el registrador SMTPHandler estándar para detectar mis excepciones de Python. ¿Hay alguna manera de poner el nombre de la excepción en el asunto del correo? Sería mucho mejor que con el tema estático, porque Gmail (y no solo Gmail) puede agrupar las conversaciones según el tema y, por lo tanto, podría agruparlo según el tipo de error.¿Hay alguna manera de configurar SMTPHandler en Python para hacer cosas más avanzadas?

Por ej., Si 50 ocurren exactamente los mismos errores + 1 diferente, vería dos conversaciones en mi bandeja de entrada en lugar de 1 grupo que contiene 51 correos electrónicos, donde puedo pasar fácilmente por alto el único diferente.

Además, ¿Hay alguna manera de evitar que se sigan enviando los mismos errores? E. g. De alguna manera, defino mi propia función para decidir si enviar o no un correo electrónico. La función tomaría información básica en params para que pueda decidir (por ejemplo, el caché & ver si ya se envió un problema de este tipo).

Busqué los documentos, pero no puedo encontrar nada como eso. Parece ser muy simple. Si SMTPHandler no puede hacer esto, ¿cuál sería la mejor y más simple alternativa? ¿Hay bibliotecas geniales?

¡Gracias!

Respuesta

7

Usted sólo tendrá que crear su propia subclase de SMTPHandler.

Para su primera solicitud: Solo tiene que anular el método getSubject(record). En cuanto a lo que puedes poner en el tema, mira help(Formatter) después de importar el formateador del registro.

Para su segunda solicitud: debe anular el método emit(record). Inspeccione el registro y tome su propia decisión sobre si debe enviarse. Si es así, simplemente llame al método super(SMTPHandler,self).emit(record).

class MySMTPHandler(SMTPHandler): 

    def getSubject(self, record): 
     return "My Error Format from the record dict" 

    def emit(self, record): 
     #check for record in self.already_send or something 
     if sendit: 
      super(MySMTPHandler,self).emit(record) 
0

Se puede heredar la clase SMTPHandler y mejorar o reemplazar su funcionalidad, por ejemplo,

class A(object): 
    def __init__(self): 
     self.email = "[email protected]" 

    def send_error(self, error): 
     send_mail(self.email, error) 

class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def send_error(self, error): 
     if not error.sent: 
      A.send_mail(self, error) 
     else: 
      #do nothing 
      pass 
1

La manera fácil y flexible es formatear no solo el contenido del correo electrónico, sino también el asunto del correo electrónico. Esto requiere la subclasificación logging.handlers.SMTPHandler.

De esta manera, si hay alguna referencia de variable en el asunto que configuró, se expandiría a pedido. Esta es la aplicación que incluye el código de prueba:

import logging, logging.handlers 
    class TitledSMTPHandler(logging.handlers.SMTPHandler): 
     def getSubject(self, record): 
      formatter = logging.Formatter(fmt=self.subject) 
      return formatter.format(record) 

    # below is to test 
    logging.getLogger().addHandler(TitledSMTPHandler(
     ('your.smtp.server',587), 
     '[email protected]', '[email protected]', 
     '%(asctime)s Error: %(message)s', 
     ('SMTP login', 'SMTP password'),() 
    )) 

    logging.error("TestError") 

Cambie la configuración de SMTP con el suyo, ejecute el código y usted debe recibir un correo electrónico en el que el mensaje de error es en el sujeto (también en el cuerpo del mensaje).

Si define el controlador en un archivo de configuración de registro, recuerde escapar de las referencias de parámetros. p.ej. %(asctime)s debe convertirse en %%(asctime)s, para evitar la interpolación prematura del configparser; sin embargo, el escape %% no está activado en y antes de Python 3.1.


Por favor, si hace una pregunta a la vez, ayudará mucho a otros Googlers. Debería comenzar dos temas, uno se llama "¿Hay alguna manera de poner el nombre de la excepción en el asunto del correo?" y el otro "¿hay alguna manera de evitar enviar aún los mismos errores?"

Solo responderé a su primera pregunta para centrarme en un tema. Tal vez pensó que las dos preguntas pueden ser dependientes entre sí, por lo tanto, deben formularse juntas, mientras que simplemente se le ocurrieron juntas. Creo que todavía es factible sugerirle que cambie el título de su pregunta para enfatizar un problema, en lugar de decir "cosas avanzadas".

También me gusta sugerir visitar comp.lang.python si la pregunta es un tema abierto y/o no se puede definir bien (por ejemplo, "Quiero cosas avanzadas, ¿qué usan los demás?")

Cuestiones relacionadas