Подтвердить что ты не робот

Регистрация с фильтрами

Я использую Logging (журнал импорта) для регистрации сообщений.

Внутри одного единственного модуля я регистрирую сообщения на уровне отладки (my_logger.debug('msg'));

Некоторые из этих отладочных сообщений поступают из функции function_a() и других из функции function_b(); Я хотел бы иметь возможность включать/отключать ведение журнала в зависимости от того, происходят ли они из a или из b;

Я предполагаю, что мне нужно использовать механизм фильтрации журналов.

Может кто-нибудь, пожалуйста, покажите мне, как должен быть приведен код ниже для того, чтобы делать то, что я хочу? спасибо.

import logging
logger= logging.getLogger( "module_name" )

def function_a( ... ):
    logger.debug( "a message" )

def function_b( ... ):
    logger.debug( "another message" )

if __name__ == "__main__":
    logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )

    #don't want function_a() noise -> ....
    #somehow filter-out function_a logging
    function_a()

    #don't want function_b() noise -> ....
    #somehow filter-out function_b logging
    function_b()

Если бы я упростил этот простой пример для большего количества модулей и более функций для каждого модуля, я был бы обеспокоен множеством регистраторов;

Могу ли я сохранить его до 1 регистратора на модуль? Обратите внимание, что сообщения журнала "структурированы", т.е. Если функция регистрирует его, выполняет некоторую работу по разбору, все они содержат префикс logger.debug( "parsing: xxx" ). Могу ли я как-то с одной строкой просто закрыть -вычет всех сообщений разбора (независимо от модуля/функции, излучающей сообщение?)

4b9b3361

Ответ 1

Просто выполните подкласс logging.Filter: http://docs.python.org/library/logging.html#filter-objects. Он будет иметь один метод filter(record), который проверяет запись журнала и возвращает True для его регистрации или False, чтобы отменить его. Затем вы можете установить фильтр либо в Logger, либо в Handler, вызвав его метод addFilter(filter).

Пример:

class NoParsingFilter(logging.Filter):
    def filter(self, record):
        return not record.getMessage().startswith('parsing')

logger.addFilter(NoParsingFilter())

Или что-то в этом роде.

Ответ 2

Не используйте глобальные. Это случайное ожидание.

Вы можете предоставить вашим регистраторам любые "." - разделенные имена, которые имеют для вас значение.

Вы можете контролировать их как иерархию. Если у вас есть журналы с именем a.b.c и a.b.d, вы можете проверить уровень ведения журнала для a.b и изменить оба регистратора.

У вас может быть любое количество регистраторов - они недороги.

Наиболее распространенным шаблоном проектирования является один регистратор на модуль. См. Именование протоколов Python

Сделайте это.

import logging

logger= logging.getLogger( "module_name" )
logger_a = logger.getLogger( "module_name.function_a" )
logger_b = logger.getLogger( "module_name.function_b" )

def function_a( ... ):
    logger_a.debug( "a message" )

def functio_b( ... ):
    logger_b.debug( "another message" )

if __name__ == "__main__":
    logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )
    logger_a.setLevel( logging.DEBUG )
    logger_b.setLevel( logging.WARN )

    ... etc ...