Я хочу использовать регистратор памяти в моем проекте. Он отслеживает последние n записей журнала. Пример минимального основного файла выглядит следующим образом:
import sys
import logging
from logging import StreamHandler
from test_module import do_stuff
logger = logging.getLogger(__name__)
class MemoryHandler(StreamHandler):
def __init__(self, n_logs: int):
StreamHandler.__init__(self)
self.n_logs = n_logs
self.my_records = []
def emit(self, record):
self.my_records.append(self.format(record))
self.my_records = self.my_records[-self.n_logs:]
def to_string(self):
return '\n'.join(self.my_records)
if __name__ == '__main__':
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
mem_handler = MemoryHandler(n_logs=10)
logger.addHandler(mem_handler)
logger.info('hello')
do_stuff()
print(mem_handler.to_string())
Тестовый модуль, из которого я импортирую do_stuff
, выглядит следующим образом:
import logging
logger = logging.getLogger(__name__)
def do_stuff():
logger.info('doing stuff')
Когда я запускаю основную функцию, два оператора журнала появляются. Один из основного, другой - из «делать вещи», но регистратор памяти получает только «привет», а не «делает вещи»:
INFO:__main__:hello
INFO:test_module:doing stuff
hello
Я предполагаю, что это потому, что mem_handler не добавляется в регистратор test_module , Я могу это исправить, добавив mem_handler явно:
logging.getLogger('test_module').addHandler(mem_handler)
Но в целом я не хочу перечислять все модули и добавлять mem_handler вручную. Как я могу добавить mem_handler ко всем регистраторам в моем проекте?