Как уничтожить обработчик логов? (и я должен сделать это?) - PullRequest
0 голосов
/ 11 ноября 2019

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

class Logging:

    # a unique identifier for each logging handler, updated below
    log_id = None

    # logger handler
    log = None

    @staticmethod
    def reset_logger_with_new_id():
        log = logging.getLogger(str(uuid.uuid4()))
        log.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(asctime)s [%(name)s] %(message)s')
        handler_console = logging.StreamHandler()
        level = logging.DEBUG if 'DEV' in os.environ else logging.INFO
        handler_console.setLevel(level)
        handler_console.setFormatter(formatter)
        log.addHandler(handler_console)
        # set the class logging handler
        Logging.log = log

if __name__ == "__main__":
     # initialization
     Logging.reset_logger_with_new_id()
     Logging.log.info("initialization things happening")
     # things happening
     while True:
         Logging.reset_logger_with_new_id()
         # the actions loop
         Logging.log.info("something in the action loop")
         something()
         Logging.log.info("something else in the action loop")
         something_else()

Выходные данные

2019-11-09 22:03:28,998 [07a48712-cf6f-49ca-ba87-c47ec9703d0c] initialization things happening
2019-11-09 22:04:29,615 [2e5f53cf-df08-4b4e-bdf9-2820a0e80a43] something in the action loop
2019-11-09 22:04:38,704 [2e5f53cf-df08-4b4e-bdf9-2820a0e80a43] something else in the action loop
2019-11-09 22:05:38,765 [21a41a51-338b-4a9f-8ed5-cd0ac40b3c20] something in the action loop
2019-11-09 22:05:47,834 [21a41a51-338b-4a9f-8ed5-cd0ac40b3c20] something else in the action loop
(...)

Поскольку в каждой итерации создается новый регистратор:

  • , следует ли мне заботиться о чем-то растущем и в конечном итоге переполненном?
  • если так - как уничтожить существующий регистратор? (предыдущий, который я бы уничтожил в начале reset_logger_with_new_id())

В документации упоминается close(), но мне не ясно, является ли этоэто то, что я должен назвать, чтобы избежать проблемы выше.

1 Ответ

1 голос
/ 11 ноября 2019

Да, это будет продолжать использовать память при создании новых экземпляров регистратора. Есть несколько способов справиться с этим. Если вам действительно нужны новые регистраторы, вы можете уничтожить предыдущий регистратор с помощью del logging.Logger.manager.loggerDict[name]. Однако я бы порекомендовал вместо этого либо использовать средство форматирования, чтобы просто печатать журналы с уникальным идентификатором на каждую итерацию, либо переименовывать регистратор. Код ниже делает последнее:

import logging
import uuid
import os
from time import sleep

class Logging:
    # logger handler
    log = None

    @staticmethod
    def initialize_logging():
        log = logging.getLogger(str(uuid.uuid4()))
        log.setLevel(logging.DEBUG)
        formatter = logging.Formatter('%(asctime)s [%(name)s] %(message)s')
        handler_console = logging.StreamHandler()
        level = logging.DEBUG if 'DEV' in os.environ else logging.INFO
        handler_console.setLevel(level)
        handler_console.setFormatter(formatter)
        log.addHandler(handler_console)
        # set the class logging handler
        Logging.log = log

    @staticmethod
    def reset_logger_with_new_id():
        name = str(uuid.uuid4())
        Logging.log.name = name
        logging.Logger.manager.loggerDict[name] = Logging.log # this is required so it can still be found by logging.getLogger(name)
        return

def something():
    pass
something_else = something

if __name__ == "__main__":
     # initialization
     Logging.initialize_logging()
     Logging.log.info("initialization things happening")
     # things happening
     while True:
         Logging.reset_logger_with_new_id()
         # the actions loop
         Logging.log.info("something in the action loop")
         something()
         Logging.log.info("something else in the action loop")
         something_else()
         sleep(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...