Я создал менеджер контекста с указанным 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 был удален из всех регистраторов?
Текущие громоздкие решения
- Во-первых, я, конечно, мог бы обернуть весь код
with
в try...finally
, но досадно не использовать мой менеджер контекста ... - Естественно, просто
del self.loghandler
в __exit__
не удаляет фактический объект из всех списков обработчиков . - Как показано в «регистрация не прекращается» ,
logging.shutdown(self.loghandler)
не будет работать. - Мое текущее рабочее решение предназначено для перебора всех регистраторов:
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)
Нет ли более эффективного решения? Как атрибут обработчика, относящийся к связанным регистраторам?