0

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

例如,我的应用程序中有一个条件,如果我想知道的数据库中不存在某些内容,但我有一个合适的默认值可以正常工作。因此,我想向我发送一封包含一些信息的电子邮件;它不一定发生在异常上。

如果我做这样的事情:

logger.error("数据库中不存在操作 %s 的费用", "actionX")

日志文件中的信息很好,但电子邮件确实缺少一些信息。这是主题行:

[Django] ERROR: Test this jazz %s

然后是身体:

None

Request repr() unavailable

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

4

2 回答 2

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@example.com"),)

...这些东西已合并到您的设置中。

然后是您的特殊日志记录类 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)
于 2012-12-18T19:26:25.320 回答
0

Django Logging 文档状态:

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

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

从文档中删减一点:

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

让您了解如何影响输出,python 的 logging.config 文档将填写可用选项。

于 2012-04-05T08:29:04.633 回答