2012-04-05 4 views
0

Ich habe Fehler E-Mails Setup über Django Logging-Mechanismus in 1.3. Es sendet mir eine nette E-Mail, wenn ein Fehler auftritt. Wenn ich jedoch eine einfache Fehlermeldung protokolliere, wird sie seltsam formatiert und ich bin mir nicht sicher warum.einfache Fehler Log-Nachricht in Django

Zum Beispiel gibt es eine Bedingung in meiner App, wo, wenn etwas in der DB nicht existiert, ich wissen möchte, aber ich habe einen geeigneten Standardwert, der gut funktioniert. Daher möchte ich eine E-Mail mit einigen Informationen an mich senden; es passiert nicht unbedingt bei einer Ausnahme.

Wenn ich so etwas tun:

logger.error ("Gebühr nicht für Aktion% s in der Datenbank vorhanden sein", "actionX")

Die Informationen in der Log-Datei ist in Ordnung, aber der E-Mail fehlen wirklich einige Informationen. Hier ist die Betreffzeile:

[Django] ERROR: Test this jazz %s 

Und dann der Körper:

None 

Request repr() unavailable 

Meine Frage ist, wie bekomme ich A) der Wert in dem Thema zu zeigen, und B) erhalten einige aktuelle, relevante Informationen im Körper .... wie Zeilennummer oder so ähnlich.

+0

Um besser zu helfen, könnten Sie bitte posten Ihre Konfiguration für Ihren Logger (aus settings.py)? – jvc26

Antwort

4

Sie müssen zwei Dinge erkennen:

  1. Sie mögen eine E-Mail senden mit Python eingebautes Logging-System und
  2. Sie sind nicht eine regelmäßige Ausnahme der Anmeldung, so dass der eingebaute Mechanismus für das Senden von E-Mail wird nicht funktionieren da es abhängig ist von einem Objekt vom Typ Ausnahme, das übergeben werden soll, und von Dingen, die in einem Traceback gespeichert werden sollen.

Wie auch immer, nicht unmöglich!

LOGGING = { 
    ... 
    'handlers': { 
     ... 
     'my_special_mail_handler': { 
      'level': 'ERROR', 
      'filters': [], 
      'class': 'myapp.loggers.MyEmailHandler', 
      'include_html': False, 
     }, 
    }, 
    'loggers': { 
     ... 
     'my_special_logger': { 
      'handlers': ['console', 'my_special_mail_handler'], 
      'level': 'DEBUG', 
      'propagate': True, 
     }, 
    } 
} 

MY_RECIPIENTS = (("Name of person", "[email protected]"),) 

... dieses Zeug wird in Ihren Einstellungen zusammengeführt.

Dann gibt es Ihre spezielle Logging-Klasse, MyEmailHandler:

from django.utils.log import AdminEmailHandler 
from django.core.mail.message import EmailMultiAlternatives 
from django.conf import settings 

class MyEmailHandler(AdminEmailHandler): 

    def emit(self, record): 
     if not getattr(settings, "MY_RECIPIENTS", None): 
      return 
     subject = self.format_subject(record.getMessage()) 
     message = getattr(record, "email_body", record.getMessage()) 
     mail = EmailMultiAlternatives(u'%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), 
        message, settings.SERVER_EMAIL, [a[1] for a in settings.MY_RECIPIENTS],) 
     mail.send(fail_silently=False) 

Jetzt sind Sie in der Lage einen speziellen Protokolleintrag zu erstellen, das sowohl ist per E-Mail und Ausgang an den Anschluss auf diese Weise:

import logging 
logger = logging.getLogger("my_special_logger") 
error = logger.makeRecord(
    logger.name, logging.ERROR, 0, 0, 
    u"Subject: Some error occured", 
    None, None, "", None, 
) 
error.email_body = msg 
logger.handle(error) 

und um Dinge einfach zu machen, verwenden Sie eine Dienstprogrammfunktion:

import logging 
def my_log(msg, body, level=logging.ERROR): 
    logger = logging.getLogger("my_special_logger") 
    error = logger.makeRecord(
     logger.name, level, 0, 0, 
     u"Subject: Some error occured", 
     None, None, "", None, 
    ) 
    error.email_body = msg 
    logger.handle(error) 
+0

Obwohl es eine Menge Arbeit zu sein scheint, ist es ein cleverer Weg, mehr Kontrolle darüber zu bekommen, was ich zu tun versuche. Vielen Dank! – JamesD

0

Der Django Logging docs Zustand:

Natürlich ist es nicht genug, nur den Code setzen Protokollierung Anrufe in. Sie müssen auch die Logger, Handler, Filter und Formatierer konfigurieren, um sicherzustellen, dass die Protokollierungsausgabe auf nützliche Weise ausgegeben wird.

Sie müssen Ihre Einstellungen in Ihrem logging.config() Wörterbuch optimieren. Damit können Sie genau festlegen, welche Informationen Sie möchten und wie Sie sie formatieren.

Schneiden ein kleines Stück von der Dokumentation:

'formatters': { 
    'verbose': { 
     'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' 
    }, 

Gibt Ihnen ein wenig eine Vorstellung davon, wie man den Ausgang beeinflussen können, und die logging.config Dokumentation für Python werden die verfügbaren Optionen ausfüllen.

+0

Die Formatierung hat anscheinend keine Auswirkung auf die gesendete E-Mail. Ihre Antwort scheint sich nur auf die eigentliche Nachricht in der von mir eingerichteten "Protokolldatei" zu beziehen. – JamesD