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

Man*_*ani 21 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,
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

(在我的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/')
Run Code Online (Sandbox Code Playgroud)

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

xee*_*ton 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/')
Run Code Online (Sandbox Code Playgroud)

  • 我觉得你在混淆.通过调用`logging`中的模块级函数,使用的记录器是根记录器.您的示例类似于`import logging`,`logger = logging.getLogger()`,`logger.info(...)`. (10认同)

sir*_*sen 13

我认为你误解Handlerlogging包中的内容.

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

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

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

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

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


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

myhandler = logging.StreamHandler()  # writes to stderr
myformatter = logging.Formatter(fmt='%(levelname)s: %(message)s')
myhandler.setFormatter(myformatter)
logger.addHandler(myhandler)
Run Code Online (Sandbox Code Playgroud)

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