【问题标题】:Using python logging in reusable Django application: "No handlers could be found for logger"在可重用的 Django 应用程序中使用 python 日志记录:“找不到记录器的处理程序”
【发布时间】:2017-06-23 18:35:08
【问题描述】:

在我正在开发的一个开源 Django 库中,logging 模块主要用于通知用户潜在的错误:

import logging

logger = logging.getLogger(__name__)

def my_wonderful_function():
    # ... some code ...
    if problem_detected:
        logger.error('Please pay attention, something is wrong...')

由于这种方法在大多数情况下都可以正常工作,因此如果 Python 2 用户没有为我的包配置日志记录系统,他们会收到错误消息:

找不到记录器“library.module”的处理程序

一旦使用记录器。

此错误不会打印到 Python 3 用户,因为当找不到特定记录器的处理程序时,有一种回退机制将消息输出到默认的 StreamHandler(请参阅 the code)。

我的问题是:

有没有一种好方法可以向用户报告错误和警告,但在用户不想配置日志记录时不打印(尤其是不打印错误)?

【问题讨论】:

标签: django logging


【解决方案1】:

我终于找到了一个行之有效的解决方案。我在我的代码中添加了这两个函数:

def logger_has_handlers(logger):
    """Since Python 2 doesn't provide Logger.hasHandlers(), we have to
    perform the lookup by ourself."""

    if six.PY3:
        return logger.hasHandlers()
    else:
        c = logger
        rv = False
        while c:
            if c.handlers:
                rv = True
                break
            if not c.propagate:
                break
            else:
                c = c.parent
        return rv


def get_default_logger(name):
    """Get a logger from default logging manager. If no handler
    is associated, add a default NullHandler"""

    logger = logging.getLogger(name)
    if not logger_has_handlers(logger):
        # If logging is not configured in the current project, configure
        # this logger to discard all logs messages. This will prevent
        # the 'No handlers could be found for logger XXX' error on Python 2,
        # and avoid redirecting errors to the default 'lastResort'
        # StreamHandler on Python 3
        logger.addHandler(logging.NullHandler())
    return logger

然后,当我需要记录器时,我不调用logging.getLogger(__name__),而是使用get_default_logger(__name__)。使用此解决方案,返回的记录器始终包含至少 1 个处理程序。

如果用户自己配置日志记录,则返回的记录器包含对已定义处理程序的引用。如果用户没有为包配置日志记录(或在没有任何处理程序的情况下配置它),与记录器关联的NullHandler 实例确保在使用时不会打印错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多