将Django消息写入日志文件也是如此

时间:2015-10-21 20:39:02

标签: django logging

由于单词" message"已经证明这很难通过搜索找到。在文档中无处不在。我正在使用Django消息(django.contrib.messages),并希望将它们挂钩到日志记录功能中。所以,如果我有这个,例如......

if user is not None:
    if user.is_active:
        login(request, user)
    else:
        messages.error(request, 'Your account is disabled.  Please contact your administrator.')
        return HttpResponseRedirect('/accounts/login/')

...我还希望通过日志处理程序将消息错误写入特定的日志文件。有没有办法通过调用消息(或者可能是它的子类化版本?)来实现这一点,或者这只是需要显式调用messages.error()以及logger每条消息?

2 个答案:

答案 0 :(得分:2)

我会这样做:

  1. 在您的项目中创建一个类似messages的应用:

    myproject/
        messages/
            __init__.py
    
  2. __init__.py文件中,您可以使用函数定义:

    from django.contrib import messages
    import logging
    
    logger = logging.getLogger("messages")
    
    def debug(request, msg, *args, **kwargs):
        messages.debug(request, msg, *args, **kwargs)
        logger.debug(msg)
    
    def info(request, msg, *args, **kwargs):
        messages.info(request, msg, *args, **kwargs)
        logger.info(msg)
    
    def warning(request, msg, *args, **kwargs):
        messages.warning(request, msg, *args, **kwargs)
        logger.warning(msg)
    
    def error(request, msg, *args, **kwargs):
        messages.error(request, msg, *args, **kwargs)        
        logger.error(msg)
    
  3. 为"消息定义处理程序"登录LOGGING变量(在settings文件中)

  4. 导入您的库而不是django.contrib.messages

  5. 有点"无聊"写,但我认为它足够普遍,可以在几个地方重复使用。当然,您可以重新定义django.contrib.messages中的其他功能。

    不幸的是,谈论继承django消息框架并没有多大意义,因为它没有被定义为类。

    希望有所帮助

答案 1 :(得分:0)

我建议您根据现有存储空间创建自定义MESSAGE_STORAGE以满足您的需求。您需要做的就是重载add方法。例如,这个基于CookieStorage

import logging
from django.contrib.messages import constants, utils
from django.contrib.messages.storage.cookie import CookieStorage

logger = logging.getLogger(__name__)

class CookieLoggerStorage(CookieStorage):
    def add(self, level, message, extra_tags=''):
        if message and level > constants.SUCCESS: # logs WARNING and ERROR
            logger.log(level, message)
        super(CookieLoggerStorage, self).add(level, message, extra_tags)

settings.py添加:

# settings.py
MESSAGE_STORAGE = "path.to.CookieLoggerStorage"

为了清楚起见,messages.constants似乎与记录器级别常量相同,因此您几乎可以使用消息级别提供记录器

django.contrib.messages.constants

DEBUG   = 10
INFO    = 20
SUCCESS = 25
WARNING = 30
ERROR   = 40

logging constants

DEBUG       10
INFO        20
WARNING     30
ERROR       40
CRITICAL    50
NOTSET      0