我有一个Django应用程序,其每个API调用都与一个transaction_id相关联。我想为每个transaction_id创建单独的日志文件。 简而言之,我想拥有多个将用于记录的文件。
我如何使用Django的内置日志记录系统执行此操作?
我可以在一个记录器中有多个处理程序。但是根据我的要求,FileHandlers必须在运行时添加,其文件名将为transaction_id。可以做到的。但是问题是如果我一次运行4个事务,则将4个处理程序添加到同一记录器中,并且根据文档记录,日志将发送到每个处理程序,从而导致1个事务日志文件记录其余3个事务的日志。
以下是我附带的内容:
class TransactionLogger:
def __init__(self, transaction_id):
self.logger = logging.getLogger('transaction_logger')
logger = self.logger
fileHandler = logging.FileHandler(transaction_id, mode='a')
formatter = logging.Formatter('%(levelname)s %(asctime)s %(filename)s:%(lineno)s - %(funcName)s() ] %(message)s')
fileHandler.setFormatter(formatter)
self.logger.addHandler(fileHandler)
self.logger.propagate = False
在每次交易开始时,我将记录器实例化为:
logger = TransactionLogger(transaction_id).logger
并记录如下:
logger.debug("Hello World")
如何维护n个将动态生成的日志文件,并在不干扰其他文件的情况下,基于transaction_id登录每个文件。
感谢您的帮助。
答案 0 :(得分:0)
我不会说存储这样的日志是一个很好的设计。更好的方法是编写自定义格式,以便在每个日志中都具有事务处理ID,通过它您将能够过滤所有日志。
仍然有两种方法可以实现此目的:
1)通过使用logging._acquireLock()
和logging._releaseLock()
,或者您可以按照here所述通过LOCK使用锁定。
2)每次创建一个新的记录器(通过继承logging.Manager并将新的记录器添加到self.loggerDict),并在执行结束时将其删除(这样系统不会耗尽内存)。