django中的简单错误日志消息

时间:2012-04-05 03:26:16

标签: django logging

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

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

如果我这样做:

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

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

[Django] ERROR: Test this jazz %s

然后身体:

None

Request repr() unavailable

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

2 个答案:

答案 0 :(得分:4)

您需要承认两件事:

  1. 您想使用Python的内置日志记录系统和
  2. 发送电子邮件
  3. 您没有记录常规异常,因此发送电子邮件的内置机制不起作用,因为它取决于要传递的异常类型对象和要存储在追溯中的内容。
  4. 无论如何,并非不可能!

    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)
    

答案 1 :(得分:0)

Django Logging docs州:

  

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

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

从文档中删除一点:

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

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