2012-04-05 49 views
0

我在1.3中通过Django的日志记录机制设置了错误电子邮件。发生错误时,它会向我发送一封很好的电子邮件。但是,当我记录一个简单的错误消息时,它的格式很奇怪,我不知道为什么。django中的简单错误日志消息

例如,我的应用程序中存在一个条件,如果某些事情不存在于我想知道的数据库中,但我有一个合适的默认值,可以正常工作。因此,我想要一封邮件发送给我一些信息;它不一定发生在Exception上。

如果我做这样的事情:

logger.error(“费并没有在数据库动作%s的存在”,“actionX”)

在日志文件中的信息是好的,但该电子邮件真的缺乏一些信息。这里的主题行:

[Django] ERROR: Test this jazz %s 

然后身体:

None 

Request repr() unavailable 

我的问题是,如何获取A)的值,在主题和B显示)获得一些实际的,相关的身体信息......就像行号或类似的东西。

+0

为了更好地帮助您,请您张贴您的记录器配置(来自settings.py)? – jvc26 2012-04-08 07:50:48

回答

4

您必须确认两两件事:

  1. 要发送使用Python的内置的日志系统和
  2. 您还没有登录正规例外,这样用于发送电子邮件内置的机制将无法正常工作的邮件因为它取决于要传递的异常类型对象以及要存储在回溯中的内容。

反正,不是不可能!

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]"),) 

......东西被合并到您的设置中。

然后,有你特别的日志类,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) 

现在,您可以创建一个特殊的日志条目,既是通过电子邮件发送并输出到终端这样:

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) 

并使东西容易,使用实用功能:

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

虽然看起来像很多工作,但它确实是一种聪明的方式,可以更好地控制我想要做的事情。谢谢! – JamesD 2013-01-29 23:27:45

0

Django Logging docs状态:

当然,这是不够的,只是把日志调用到你的代码。您还需要配置记录器,处理程序,过滤器和格式化程序,以确保以有用的方式输出日志记录输出。

您需要调整您的logging.config()字典中的设置。这可以让你准确地确定你想要的信息以及如何格式化。

从文档切一个小一点:

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

给你一点想法,你可以如何影响输出,并为蟒蛇的logging.config文档将填写可用的选项。

+0

格式显然不会影响发送的电子邮件。您的答案似乎只与我设置的“日志文件”中的实际消息有关。 – JamesD 2012-04-06 02:04:18