我想在用例函数中注入一个自定义记录器实例:
def api_func(project_dir: str, case_name: str) -> None:
"""This function will be called from web API by multiple clients."""
logger = get_logger(project_dir, case_name)
some_use_case(logger)
这是我的get_logger
函数:
import logging
import os
def get_logger(project_dir: str, case_name: str) -> logging.Logger:
logger = logging.getLogger(case_name) # <- singleton...
logger.setLevel(logging.INFO)
fh = logging.FileHandler(
os.path.join(project_dir, 'file.log'),
delay=True,
)
logger.addHandler(fh)
return logger
问题是多个客户端把api_func
和case_name
称为同一个函数,它们有时是相同的。因此,相同的日志实例将被多个客户端拾取。导致共享日志数据,这是不希望的。
我可以实例化相同名称的记录器,但实际上可以是不同的对象吗?
文档https://docs.python.org/3/library/logging.html#logger-objects明确提到永远不要直接实例化记录器实例,而是建议使用logging.getLogger
函数。但是这会返回对同一个对象的引用,这是我想避免的。我需要的是创建一个全新的记录器实例,每次我调用get_logger
函数。这可能吗?
直接用logging.Logger
实例化记录器是否有任何问题?文档中似乎没有提到这些。
记录器名称应该与应用程序的某个区域相关(例如Python模块,或其中的一部分),而不是与应用程序数据相关,例如案例名称。您没有按照应该使用的方式使用日志记录,因此遇到问题也就不足为奇了。有关日志抽象的高级视图,请参阅这篇博文(篇幅太长,无法在此复制)。