记录器实例化的最佳实践是什么?目前,我正在使用它来创建一个记录器:
def create_logger(logger_name='default_logger_name', tags={"application": "default-app", "environment": "development"}):
handler = logging_loki.LokiQueueHandler(
Queue(-1),
url="https://somewhere",
tags=tags,
auth=("some", "thing="),
version="1",
)
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.addHandler(get_console_handler())
return logger
def get_console_handler():
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
log_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(log_format)
return console_handler
然后打电话给
self.logger = create_logger(__name__)
在任何我想要记录的班级里. 这有两个问题.第一个问题是,我的班级突然与洛基联系在一起,这显然是糟糕的.第二个问题是,即使我没有使用任何使用额外模块的处理程序,我也注意到在单元测试期间,我必须在不同的测试之间显式地删除处理程序,否则第二次运行的测试的输出将是第二次运行的测试的2倍,第三次运行的测试的输出是第三次测试的3倍,以此类推,因为重复的处理程序不断被添加而从未被删除. 我应该使用哪种模式来避免这些问题?我想到的第一件事是在类构造函数中传递记录器创建方法.这解决了第一个问题,但没有解决必须删除处理程序的问题.第二种方法是传递一个记录器实例,并处理类外部的所有事情(比如在测试之间删除处理程序).然而,这仍然会让我不得不进行显式的处理程序删除,这感觉有点奇怪.