【发布时间】:2022-09-27 17:36:06
【问题描述】:
我希望我的函数do_x 使用(子)记录器__main__.do_all,该记录器在调用do_x 的父范围do_all 中定义。相反,默认情况下使用根记录器。
有没有办法强制do_x 使用子记录器__main__.do_all?我是否应该将记录器作为参数传递给do_x,即使在许多帖子中都不推荐它?假设我也想使用其他(子)记录器从其他范围调用do_x。
import logging
logging.basicConfig(format=\'%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s\')
logger = logging.getLogger(__name__)
def do_x():
logger.warning(\'doing x\')
def do_all():
logger = logging.getLogger(__name__ + \'.do_all\')
logger.warning(\'Starting do_all\')
do_x()
def do_all_other():
logger = logging.getLogger(__name__ + \'.do_all_other\')
logger.warning(\'Starting do_all_other\')
do_x()
do_all()
do_all_other()
生产
2022-09-27 11:34:40,562 - __main__.do_all - do_all - WARNING - Starting do_all
2022-09-27 11:34:40,562 - __main__ - do_x - WARNING - doing x
2022-09-27 11:34:40,562 - __main__.do_all_other - do_all_other - WARNING - Starting do_all_other
2022-09-27 11:34:40,562 - __main__ - do_x - WARNING - doing x
我希望输出的第二行和最后一行分别使用__main__.do_all 和__main__.do_all_other
-
do_x()需要知道从哪里调用它。只有两种方法:将父节点的名称作为参数传递,或者检查堆栈 -
没有真正定义记录器在功能。调用
getLogger返回(如果需要,创建)由logging模块管理的特定记录器实例,无论在哪里调用getLogger。