2016-01-24 75 views
2

我大量使用python线程,并且我的许多用例都要求我将不同的任务执行记录在不同的记录器名称下。通配符设置python logger级别

一个典型的代码示例:

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水平。我的问题是要找出这是否可以更容易地完成。

回答

1

因为记录器如果没有明确设置就会继承它们的父级别,所以你可以做例如

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

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

请注意,除非要将不同的处理程序附加到不同的线程记录器,否则每个线程都有一个记录器没有多大好处 - 您始终可以使用other methodstask_index值写入日志。

+0

你错过了这一点。这是一个简单的解决方案,但仍然是一个黑客。如果我想这样做: 'logging.getLogger('main.task。*。subtask_a').setLevel(logging.INFO)' 'logging.getLogger('main.task。*。subtask_b')。setLevel (logging.DEBUG)' –

+0

我现在已经看到你的编辑了。这更有意义。 –