【问题标题】:Logging each API calls into a separate file将每个 API 调用记录到单独的文件中
【发布时间】:2019-02-14 06:39:17
【问题描述】:

我有一个 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登录到每个文件而不干扰其他文件。

感谢任何帮助。

【问题讨论】:

  • 你可能还不知道,但你不想拥有它。如果您想了解它,请创建一个包含几千个文件(或您期望的更多文件)的文件夹并列出它,记录所用时间,将文件数量加倍并注意列出时间的机会。

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


【解决方案1】:

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

还有两种方法可以实现:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2013-08-13
    • 2017-11-29
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多