没有为记录器找到处理程序

时间:2011-07-19 10:19:16

标签: python django logging

我是Django的新手。我正在尝试Django登录。尝试时,我收到此错误 [“找不到处理程序”处理程序“示例”“] ..这里是我的代码,

(在我的settings.py中)

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'simple': {
            'format': '%(asctime)s %(levelname)s %(name)s %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'DEBUG',
            'class':'logging.handlers.RotatingFileHandler',
            'filename': '/home/linuxuser/mani/f/logs/msg.log',
            'maxBytes': 1024*1024*5, # 5 MB
            'backupCount': 5,
            'formatter':'simple',
        },
    },
    'loggers': {
        'sample': {
            'handlers': ['default'],
            'level': 'DEBUG',
            'propagate': True,
        },
    }
}

(在我的views.py中)

import logging
import logging.handlers
from django.conf import settings
logger = logging.getLogger('sample')

def empdel(request,id):
    e = get_object_or_404(emp, pk=id)
    e.delete()
    logger.info('A row is deleted successfully !!!')
    return HttpResponseRedirect('/empthanks/')

在运行此代码时,我收到了这个错误,即 [“找不到处理程序的”处理程序“样本”“] ..我的代码怎么了?为什么即使我在LOGGING中使用处理程序,我也会收到这样的错误?而且我正在尝试将日志消息保存到我在LOGGING中使用的文件中......任何想法?在此先感谢!!!

2 个答案:

答案 0 :(得分:23)

文档对此有点不清楚,但是当您使用内置功能指定日志记录设置时,您不需要获取记录器的实例。

您只需执行以下操作:

import logging

def empdel(request,id):
    e = get_object_or_404(emp, pk=id)
    e.delete()
    logging.info('A row is deleted successfully !!!')
    return HttpResponseRedirect('/empthanks/')

答案 1 :(得分:13)

我认为你误解了Handler包中的logging是什么。

Handler是您附加到Logger的对象。 只要记录器有要处理的消息,它就会将消息发送给所有处理程序。 此外,Logger存在于树结构中,其根部恰当地命名为“root”Logger。 在向处理程序发送消息后,Logger可以将其传递给树中的父节点(由Logger实例的propagate属性确定)。

稍微有些幽默,我曾经发现一个应用程序错误,其中有人开始使用名为“root”的Logger,这与Root Logger不同。

请勿使用根记录器(由logging.info和公司或logging.getLogger()访问)。 您附加的任何处理程序或您更改的设置也会影响表现良好的库,这些库将错误传播到根记录器。 例证:我曾经使用root logger编写了一个简单的脚本,而不是懒惰。 然后,我将一些调用合并到boto,并获得了大量调试消息,这些消息正在传播到根记录器。 建议您始终通过创建{{1}的记录器来创建一个记录器,其名称与命名空间中的包名称相匹配(这也导致具有getLogger.的解释的良好继承结构) }

我强烈建议您仔细阅读logging.getLogger(__name__)文档中有关记录器对象的部分:https://docs.python.org/2/library/logging.html

您可能会注意到您的配置还指定了logging。 格式化程序在处理程序处理消息时处理消息的呈现,因此单个消息的格式可能与终端输出的格式不同,例如rsyslog。


所有这些都说,要修复你的代码,你可以使用你创建的记录器,只需附加一个处理程序。 我建议创建一个Formatter(基础StreamHandler类不是要实例化的,但由于可怕的原因不是ABC),因为它涵盖了很多典型的用例。

Handler

然而,似乎Django配置已经包含了很多这样的信息,当然不是像上面那样配置的。 没有真正编写Django应用程序,我不想给你这方面的错误信息,但Django在这里提供了很好的文档:https://docs.djangoproject.com/en/dev/topics/logging/