我大量使用 python 线程,我的许多用例要求我在不同的记录器名称下记录单独的任务执行。
一个典型的代码示例是:
def task(logger=logger):
global_logger.info('Task executing')
for item in [subtask(x) for x in range(100000)]:
# While debugging, one would generally prefer to see these
global_logger.debug('Task executed item {}'.format(item))
global_logger.info('Task done')
def thread_task(task_index, logger=logger):
task(logger=global_logger.getChild('main.task.{}'.format(task_index)))
def main():
pool = Pool(10)
for item in pool.map(thread_task, range(128))
pass
python 日志记录模块中是否有任何标准方法可以让我一次为所有线程设置日志记录级别?
在代码中,我试图做的是:
# For all threads
logger.getChild('main.task.0').setLevel('INFO')
logger.getChild('main.task.1').setLevel('INFO')
logger.getChild('main.task.2').setLevel('INFO')
我应该注意,我知道我可以在task_thread
内设置级别。我的问题是找出这是否可以更容易地完成。
因为记录器继承了其父级的级别,如果没有明确设置,你可以这样做
,例如root_name = global_logger.name
logging.getLogger(root_name + '.main.task').setLevel(logging.INFO)
这意味着所有子记录器都会继承该级别,除非为其中一个明确设置了级别。
请注意,除非您想将不同的处理程序附加到不同的线程记录器,否则每个线程都有一个记录器不会获得太多好处 - 您始终可以使用其他方法将task_index
值放入日志中。
我在抑制BAC0
库的输出时遇到了同样的问题。我尝试更改父记录器,但没有更新子记录器(Python 3.9)
这个答案是基于这篇文章中接受的答案:如何使用python.logging模块列出所有现有的记录器
for name in logging.root.manager.loggerDict:
if name.startswith("main.task."):
logging.getLogger(name).setLevel(logging.INFO)
您可能可以用一些用于通配符表示法的正则表达式匹配来替换name.startswith("main.task.")
,但这应该可以为您解决问题。
它的作用是获取并迭代已配置的每个记录器,并检查名称是否与您的搜索条件匹配。如果是这样,它将按该名称获取记录器,并将级别设置为 INFO
。