Регистрация каждого вызова API в отдельный файл - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть приложение Django, каждый вызов API которого связан с транзакцией_id. Я хочу создать отдельные файлы журнала для каждого транзакции. Проще говоря, я хочу иметь несколько файлов, которые я буду использовать для регистрации.

Как я могу сделать это, используя встроенную систему регистрации Django?

Я могу иметь несколько обработчиков в одном логгере. Но согласно моему требованию FileHandlers должен быть добавлен во время выполнения, чье имя файла будет транзакцией_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 файлов журналов, которые будут генерироваться динамически, и регистрироваться в каждом файле на основе транзакции_id, не мешая другим файлам.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 октября 2018

Я бы не сказал, что это хороший дизайн для хранения таких журналов. Лучшим подходом было бы написать собственный формат, чтобы иметь идентификатор транзакции в каждом журнале, с помощью которого вы сможете фильтровать все ваши журналы.

Тем не менее, есть два способа добиться этого:

1) Используя logging._acquireLock() и logging._releaseLock(), ИЛИ вы можете использовать блокировку через LOCK, как объяснено здесь .

2) Создайте новый регистратор каждый раз (наследуя logging.Manager и добавляя новый регистратор в self.loggerDict) и удаляйте его в конце выполнения (чтобы система не выходила из памяти).

...