通过通配符设置python记录器级别

时间:2016-01-24 01:55:13

标签: python logging

我大量使用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内设置级别。我的问题是要找出这是否可以更容易。

2 个答案:

答案 0 :(得分:2)

因为如果没有明确设置记录器继承其父级别,你可以这样做。

root_name = global_logger.name
logging.getLogger(root_name + '.main.task').setLevel(logging.INFO)

这意味着所有子记录器都会继承该级别,除非为其中一个明确设置了级别。

请注意,除非您想要将不同的处理程序附加到不同的线程记录器,否则每个线程都有一个记录器可以获得很多好处 - 您始终可以使用other methods来放置{{1}日志中的值。

答案 1 :(得分:0)

我在抑制 BAC0 库的输出时遇到了同样的问题。我尝试更改父记录器,但没有更新子记录器(Python 3.9)

此答案基于此帖子中已接受的答案:How to list all existing loggers using python.logging module

for name in logging.root.manager.loggerDict:
    if name.startswith("main.task."):
        logging.getLogger(name).setLevel(logging.INFO)

您可能可以用通配符表示法的一些正则表达式匹配替换 name.startswith("main.task."),但这应该对您有用。

它的作用是获取并迭代每个已配置的记录器,并检查名称是否符合您的搜索条件。如果是,它将获取该名称的记录器,并将级别设置为 INFO