Модуль ведения журнала Python изолирует регистраторы

На сервере Rest API я использую модуль ведения журнала, чтобы регистрировать запуск скрипта и отправлять результат клиенту. Я использую ведение журнала с глобальным обработчиком файлов и обработчиком одного потока. Ответ Http зависит от количества ошибок и критичности в регистраторе. Чтобы подсчитать регистратор и ошибку, я использую пользовательскую версию регистратора.

На основе этого публикации Я написал следующий код для подсчета вызовов метода

def init_logger(lid: str):
    log = MyLogger(str(lid))
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    log.addHandler(ch)
    log.setLevel(logging.DEBUG)
    return log

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

log1 = init_logger(1)
log2 = init_logger(2)
log1.info("INFO 1")
print(log2.info.called) -->1

person Christian Sicari    schedule 14.04.2021    source источник


Ответы (1)


Это не работает, потому что использование декоратора для этого - ужасный способ подсчета журналов. Что делать, если кто-то пишет журнал, используя log1.log(logging.INFO, "INFO 1") вместо удобного ярлыка?

Вот гораздо лучший способ, который также используется в документации python предлагает сделать такие вещи:

import logging
from collections import Counter

def counting_filter(record):
    logger = logging.getLogger(record.name)
    logger.counter[record.levelno] += 1
    return True

def init_logger(lid):
    log = logging.getLogger(str(lid))
    log.counter = Counter() # <-- added this line, but count could be stored anywhere
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    log.addHandler(ch)
    log.setLevel(logging.DEBUG)
    log.addFilter(counting_filter) # <-- added Filter here
    return log

log1 = init_logger(1)
log2 = init_logger(2)

log1.info("info 1")

print(log1.counter[logging.INFO]) # 1
print(log2.counter[logging.INFO]) # 0
person blues    schedule 15.04.2021