12

我使用 创建了一个数据库ZODB,然后将其复制粘贴到另一台 PC。我想知道为什么每次我登录这个数据库(复制的)我都会收到这个错误:

no handlers could be found for logger (ZODB.FileStorage)

注意:程序不会中断,它只是以红色打印出语句,就好像它是一个错误一样。

这是什么烦人的消息,为什么每次登录时都会出现?

更新号(1):什么是 python 日志系统?为什么我需要在我的应用程序中配置它?

笔记:

  1. 我只使用 ZODB。

  2. 我的操作系统是 Windows XP sp2。

4

1 回答 1

27

简答

无需为您的应用程序配置它。这样做很有用。

长答案

logging模块是一个 python 模块,它允许任何 python 代码以与使用它的实际应用程序输出无关的方式记录信息。任何深度的库都可以导入日志模块、日志信息、警告、错误等,而不必确切知道用​​户将如何接收它们。

您所看到的是您自己的应用程序中缺少处理程序。ZODB 显然是记录信息,但由于您没有定义处理程序,因此这些记录信息只是蒸发到以太中。它通知您,如果您想查看一些日志记录信息,您应该定义一个处理程序

记录食谱

import logging

# create logger with 'spam_application'
logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
fh = logging.FileHandler('spam.log')
fh.setLevel(logging.DEBUG)
# create console handler with a higher log level
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# create formatter and add it to the handlers
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# add the handlers to the logger
logger.addHandler(fh)
logger.addHandler(ch)

此示例为您的应用创建一个带有名称的记录器。然后它创建两种类型的处理程序。一个是文件处理程序,用于将 DEBUG 级别的日志写入文件。第二个是流处理程序,它将向您的控制台发送错误。

如果您想在控制台中看到更详细的信息,可以将日志级别更改为 INFO:

ch = logging.StreamHandler()
ch.setLevel(logging.INFO)

还要注意“格式化程序”的概念。您可以为不同的处理程序设置不同的日志格式。

如果您至少在您的应用程序中创建了一个流处理程序,那么它将不再警告您尚未定义处理程序。

对于 python 2.7+,该logging模块包括一个NullHandler. 它旨在在库(例如您的数据库库)中用作默认处理程序,当最终用户在没有任何日志记录处理程序的情况下使用库时(如您所做的那样),它可以消除错误。因此,如果您根本不关心日志记录,只是想使其静音,您可以NullHandler在自己的代码中添加 a。建议实际设置日志记录,但这只是另一种选择:

将 NullHandler 添加到记录器

import logging
logging.getLogger('spam_application').addHandler(logging.NullHandler())
于 2012-06-25T19:09:48.490 回答