【问题标题】:Creating a custom django logging handler. 'module' object has no attribute 'handlers'创建自定义 django 日志记录处理程序。 “模块”对象没有属性“处理程序”
【发布时间】:2018-12-05 20:49:59
【问题描述】:

我正在尝试创建一个基于类的日志记录处理程序,当应用程序使用 django 提供的一些内置日志记录配置看到 DisallowedHost 异常时,它会通知某些第三方服务。

但是,我遇到了一个特定的 import 错误,我无法理解如何解决。

我的设置.py

LOGGING = {
    ...
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'notify_my_service': {
            'level': 'ERROR',
            'class': 'tools.exception_logging.NotifyMyServiceHandler'
        }
    },
    'loggers': {
        ...
        'django.security.DisallowedHost': {
            'handlers': ['notify_my_service'],
            'propagate': False,
        },
    },
}

我的异常处理程序:

import logging

class NotifyMyServiceHandler(logging.handlers.HTTPHandler):
    def emit(self, error):
        doSomething()

大回溯

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 227, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/runserver.py", line 117, in inner_run
    autoreload.raise_last_exception()
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 250, in raise_last_exception
    six.reraise(*_exception)
  File "/usr/local/lib/python2.7/dist-packages/django/utils/autoreload.py", line 227, in wrapper
    fn(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/__init__.py", line 22, in setup
    configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
  File "/usr/local/lib/python2.7/dist-packages/django/utils/log.py", line 75, in configure_logging
    logging_config_func(logging_settings)
  File "/usr/lib/python2.7/logging/config.py", line 794, in dictConfig
    dictConfigClass(config).configure()
  File "/usr/lib/python2.7/logging/config.py", line 576, in configure
    '%r: %s' % (name, e))
ValueError: Unable to configure handler 'notify_my_service': 'module' object has no attribute 'handlers'

因此,由于某种原因,日志模块似乎没有正确导入。我已经尝试过来自其他线程的示例,例如在异常处理程序模块中导入设置。

是否可以用这种方式为 django 日志编写自定义处理程序?

【问题讨论】:

    标签: django exception exception-handling django-1.11 django-logging


    【解决方案1】:

    当我在这里用代码模拟你的情况时,我遇到的问题是这段代码,因为logging 模块没有handlers 属性而出错。

    import logging
    
    class NotifyMyServiceHandler(logging.handlers.HTTPHandler):
        def emit(self, error):
            doSomething()
    

    您正在寻找的是导入logging.handlers 模块。所以您需要:

    import logging.handlers
    
    class NotifyMyServiceHandler(logging.handlers.HTTPHandler):
        def emit(self, error):
            doSomething()
    

    不幸的是,logging.config 模块通过引发隐藏原始堆栈跟踪的新异常来报告错误,这使得查找原始错误变得困难。

    【讨论】:

    • 是的,对不起,我应该更新这个问题,因为我发现了同样的问题,这导致了您发现的异常。它似乎也没有使用简单的中间件工作,因为 django 的 DisallowedHost 处理发生在任何中间件执行之前。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 2020-05-27
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2011-10-20
    • 2019-05-23
    相关资源
    最近更新 更多