Сводный счет для регистрации Python - PullRequest
6 голосов
/ 17 мая 2010

В конце моей программы на Python я хотел бы получить сводную информацию о количестве элементов, зарегистрированных в стандартном модуле logging. Я бы хотел, чтобы можно было получить счетчик для каждого указанного имени (и, возможно, его детей). Например. если у меня есть:

input_logger = getLogger('input')
input_logger.debug("got input1")
input_logger.debug("got input2")
input_logger.debug("got input3")

network_input_logger = getLogger('input.network')
network_input_logger.debug("got network input1")
network_input_logger.debug("got network input2")

getLogger('output')
output_logger.debug("sent output1")

Тогда в конце я бы хотел получить резюме, такое как:

input: 5
input.network: 2
output: 1

Я думаю, вызывая метод getcount() для логгера или обработчика.

Что было бы хорошим способом для достижения этой цели? Я предполагаю, что это будет включать в себя подкласс одного из классов в модуле logging, но я не уверен, что будет лучшим путем.

Ответы [ 2 ]

3 голосов
/ 17 мая 2010

Использование декоратора может быть довольно элегантным, я не проверял это, но что-то вроде этого может работать:

class myDecorator(object):
    def __init__(self, inner):
        self.inner = inner
        self.log = {}

    def __getattr__(self,name):
        self.log[name] = self.log.get(name,0)+1
        return getattr(self.inner,name)

    def __setattr__(self,name,value):
        setattr(self.inner,name,value)

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

Не думаю, что я выспался, идея заключалась бы в том, чтобы обернуть вызовы в ваш логгер, я смешиваю использование декоратора с шаблоном декоратора. (На самом деле сочетание шаблона и синтаксиса было бы отличным ответом)

Вот более полное решение. Извините, я понял, что я был кем-то, кто ошибался в Интернете .

class LoggerLogger(object):
    def __init__(self,inner,name):
        self.inner = inner
        self.calls = 0
    def __call__(self,*args,**kwargs):
        self.calls += 1
        return self.inner(*args,**kwargs)


def loggerDecorator(func):
    def inner(name):
        logger = func(name)
        logger.debug = LoggerLogger(logger.debug,name)
    return inner

getLogger = loggerDecorator(getLogger)
2 голосов
/ 17 мая 2010

Я думаю, что шаблон декоратора может быть самым чистым методом для реализации этого.

Вы передадите экземпляр Logger в LoggerDecorator, который будет иметь тот же интерфейс, что и регистратор. Когда один из методов вызывается, тогда увеличивайте переменную-член по мере необходимости. Тогда реализация метода getCount () будет тривиальной.

Вот ссылка на реализацию декоратора в Python:

http://wiki.python.org/moin/DecoratorPattern

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...