0

我有一个 Django 应用程序,其每个 API 调用都与一个 transaction_id 相关联。我想为每个 transactions_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登录到每个文件而不干扰其他文件。

任何帮助表示赞赏。

4

1 回答 1

0

我不会说像这样存储日志是一个好的设计。更好的方法是编写自定义格式以在每个日志中包含事务 ID,您可以通过它过滤所有日志。

仍然有两种方法可以实现这一目标:

1)通过使用logging._acquireLock()and logging._releaseLock(),或者您可以通过 LOCK 使用锁定,如此所述。

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

于 2018-10-24T12:53:33.170 回答