繁体   English   中英

从父 function scope 继承 python 记录器

[英]Inherit python logger from parent function scope

我希望我的 function do_x使用在调用 do_x 的父 scope do_all中定义的(子)记录器__main__.do_all do_x 相反,默认情况下使用根记录器。

有没有办法强制do_x使用子记录器__main__.do_all 我是否应该将记录器作为参数传递给do_x ,即使在许多帖子中都不推荐它? 假设我也想使用其他(子)记录器从其他范围调用do_x

import logging
logger = logging.getLogger(__name__)

console_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
console_handler.setLevel(logging.INFO)
logger.addHandler(console_handler)
logger.setLevel(logging.INFO)

def do_x():
    logger.info('doing x')

def do_all():
    logger = logging.getLogger(__name__ + '.do_all')
    logger.info('Starting do_all')
    do_x()

def do_all_other():
    logger = logging.getLogger(__name__ + '.do_all_other')
    logger.info('Starting do_all_other')
    do_x()

do_all()
do_all_other()

生产

2022-09-26 15:10:47,255 - __main__.do_all - do_all - INFO - Starting do_all
2022-09-26 15:10:47,255 - __main__ - do_x - INFO - doing x
2022-09-26 15:10:47,255 - __main__.do_all_other - do_all_other - INFO - Starting do_all_other
2022-09-26 15:10:47,256 - __main__ - do_x - INFO - doing x

我希望 output 的第二行和最后一行分别使用__main__.do_all__main__.do_all_other

import logging
import inspect

logging.basicConfig(format='%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s')

def do_x():
    logger_name = __name__ + '.' + inspect.stack()[1].function
    logger = logging.getLogger(logger_name)
    logger.warning('some log')

def do_all():
    do_x()

def do_other():
    do_x()


do_all()
do_other()

生产

2022-09-26 17:33:06,967 - __main__.do_all - do_x - WARNING - some log
2022-09-26 17:33:06,967 - __main__.do_other - do_x - WARNING - some log

需要最新版本的 python,但也适用于旧版本。 inspect.stack()只是在旧版本中以稍微不同的格式返回数据。

logger 命名空间独立于 function 范围。 do_x应该简单地对getLogger进行相同的调用以使用相同的Logger实例。

def do_x():
    logging.getLogger(__name__ + '.do_all').info('doing x')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM