Python регистрация: как удалить обработчик из всех регистраторов? - PullRequest
0 голосов
/ 19 февраля 2020

Я создал менеджер контекста с указанным c обработчиком журналирования, который пользователь может добавить к регистраторам по своему выбору.

Вот код контекста:
# module mycontext.py
import logging

class myContext(object):
    def __init__(self):
        pass
    def __enter__(self):
        # Create a specific loghandler:
        logformat = logging.Formatter()
        self.loghandler = logging.FileHandler('mycontext.log')
        self.loghandler.setFormatter(logformat)
        return self
    def __exit__(self, etype, evalue, tb):
        self.loghandler.close()
        # Now remove that handler everywhere
        # ...?
Вот пример использования:
# Main application
from mycontext import myContext
import logging
logger = logging.getLogger(__name__)

with myContext() as ctxt:
    # mycontext gives the possibility to log messages to it: 
    logger.addHandler(ctxt.loghandler)

    pass

Теперь, когда контекст вышел, как я могу убедиться, что ctxt.loghandler был удален из всех регистраторов?

Текущие громоздкие решения

  1. Во-первых, я, конечно, мог бы обернуть весь код with в try...finally, но досадно не использовать мой менеджер контекста ...
  2. Естественно, просто del self.loghandler в __exit__ не удаляет фактический объект из всех списков обработчиков .
  3. Как показано в «регистрация не прекращается» , logging.shutdown(self.loghandler) не будет работать.
  4. Мое текущее рабочее решение предназначено для перебора всех регистраторов:
    def __exit__(self, etype, evalue, tb):
        self.loghandler.close()
        logging.root.removeHandler(self.loghandler)
        for logname, logger in logging.root.manager.loggerDict.items():
            logger.removeHandler(self.loghandler)

Нет ли более эффективного решения? Как атрибут обработчика, относящийся к связанным регистраторам?

...