【问题标题】:Python logging adds additional handlersPython 日志记录添加了额外的处理程序
【发布时间】:2020-01-27 12:29:03
【问题描述】:

我正在尝试掌握 Python 的日志记录模块,坦率地说,到目前为止还无法实现。目前我的主脚本中有一个“主”记录器:

logger = logging.getLogger(__name__)
    handler = logging.FileHandler('debug.log')
    handler.setFormatter(logging.Formatter('%(levelname)s: %(asctime)s: %(name)s: %(message)s'))
    logger.addHandler(handler)
    logger.setLevel(logging.DEBUG)
    logger.debug(
        '{} run for {} using {} values.'.format(
            skill, str(datetime.now()), key, mode
        )
    )

我在导入的模块中有一个辅助记录器:

logger = logging.getLogger(__name__)
            handler = logging.FileHandler('debug.log')
            handler.setFormatter(logging.Formatter('%(levelname)s: %(asctime)s: %(name)s: %(message)s'))
            logger.addHandler(handler)

但是,尽管我告诉两个记录器只记录到一个文件(两者都只有我设置的处理程序),但我仍然从根记录器打印到 stout 的信息。调用 logging.root.handlers 显示记录器有一个 StreamHandler,它只在导入包含第二个模块的模块时出现。

我解决附加流的黑客方法是从根处理程序中删除。但是,这感觉像是一个非规范的解决方案。我假设我以某种方式错误地实现了模块,而不是模块的预期功能。您打算如何以这种分层方式正确设置记录器?

【问题讨论】:

    标签: python-2.7 logging


    【解决方案1】:

    适当的 [mcve] 在这里肯定会有所帮助 - 我无法重现这个突然出现的根记录器处理程序。

    话虽这么说,你还是做错了:logging 模块的主要目标之一,并且没有清楚地明确记录,是将记录器的使用(.getLogger()logger.log())调用与日志记录配置。

    关键是库代码无法知道它将在哪个上下文中使用——只有应用程序会——所以库代码无论如何都不应该尝试配置它们的记录器——只是获取一个记录器并使用它,期间。然后由应用程序(这里是您的 main.py 脚本)来配置库的记录器(提示:.dictConfig() 函数是迄今为止最有用的一次配置所有内容的方法)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多