Python日志记录添加了其他处理程序

时间:2020-01-27 12:29:03

标签: python-2.7 logging

我正在尝试掌握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)

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

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

1 个答案:

答案 0 :(得分:0)

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

话虽如此,但您还是做错了:logging模块的主要目标之一,并且没有明确记录的明确目的是分开记录器的用法(.getLogger()和{{ 1}})从日志配置中调用。

问题在于,库代码无法知道将在哪个上下文中使用它-只有应用程序可以-因此库代码无论如何都不应尝试配置其记录器-只是获取一个记录器并在一段时间内使用它即可。然后,由应用程序(这里是logger.log()脚本)来配置lib的记录器(提示:main.py函数是立即配置传送的最有用的方法)。

相关问题