将每个API调用记录到单独的文件中

时间:2018-09-09 18:27:55

标签: python django logging error-logging django-logging

我有一个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登录每个文件。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不会说存储这样的日志是一个很好的设计。更好的方法是编写自定义格式,以便在每个日志中都具有事务处理ID,通过它您将能够过滤所有日志。

仍然有两种方法可以实现此目的:

1)通过使用logging._acquireLock()logging._releaseLock(),或者您可以按照here所述通过LOCK使用锁定。

2)每次创建一个新的记录器(通过继承logging.Manager并将新的记录器添加到self.loggerDict),并在执行结束时将其删除(这样系统不会耗尽内存)。

相关问题