我正在尝试掌握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处理程序中删除。但是,这感觉像是非规范的解决方案。我假设我以某种方式实现了模块错误,而不是模块的预期功能。您如何正确地以这种分层方式设置记录器?
答案 0 :(得分:0)
适当的[mcve]在这里肯定会有所帮助-我无法重现突然出现的root logger处理程序。
话虽如此,但您还是做错了:logging
模块的主要目标之一,并且没有明确记录的明确目的是分开记录器的用法(.getLogger()
和{{ 1}})从日志配置中调用。
问题在于,库代码无法知道将在哪个上下文中使用它-只有应用程序可以-因此库代码无论如何都不应尝试配置其记录器-只是获取一个记录器并在一段时间内使用它即可。然后,由应用程序(这里是logger.log()
脚本)来配置lib的记录器(提示:main.py
函数是立即配置传送的最有用的方法)。