Сообщить об ошибке.

Класс Filter() модуля logging в Python

Создать дополнительный фильтр сообщений Logger

Синтаксис:

import logging

logging.Filter(name='')

Параметры:

  • name='' - имя регистратора.

Возвращаемое значение:

  • экземпляр класса logging.Filter.

Описание:

Базовый класс Filter() модуля logging возвращает экземпляр класса logging.Filter. Если указано имя name, то это должно быть имя регистратора, созданного функцией logging.getLogger(name), которому вместе со своими дочерними элементами будут разрешены события через фильтр. Если имя name - пустая строка, то фильтр разрешает каждое событие.

Фильтры могут использоваться обработчиками Handler и регистраторами Logger для более сложной фильтрации, чем это предусмотрено уровнями логирования. Базовый класс фильтра допускает только события, которые находятся ниже определенной точки в иерархии регистратора. Например, фильтр, инициализированный с помощью ‘A.B’, позволит регистрировать события, регистраторам ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ и т. д., но не ‘A.BB’, ‘B.A.B’ и т. д. Если инициализируется с пустой строкой, то передаются все события.

Метод объекта Filter.

filter(record):

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

Обратите внимание, что с фильтрами, прикрепленными к обработчикам, обращаются до того, как обработчик отправляет событие, тогда как к фильтрам, прикрепленным к регистраторам, обращаются всякий раз, когда регистрируется событие, используя debug(), info() и т. д. перед отправкой события обработчикам. Это означает, что события, сгенерированные регистраторами-потомками, не будут фильтроваться настройкой фильтра регистратора, если только этот фильтр не был применен к этим регистраторам-потомкам.

На самом деле, не нужно создавать подкласс Filter: можно передать любой экземпляр, у которого есть метод .filter с той же семантикой.

Хотя фильтры используются главным образом для фильтрации записей на основе более сложных критериев, чем уровни, они могут видеть каждую запись, которая обрабатывается обработчиком или регистратором, к которому они присоединены: это может быть полезно, если вы хотите выполнить такие действия, как подсчет количества записей, которые были обработаны определенным регистратором или обработчиком. Или добавлять или удалять атрибуты в обрабатываемой записи LogRecord. Очевидно, что изменение LogRecord необходимо выполнять с некоторой осторожностью. Такое поведение позволяет вводить контекстную информацию в журналы регистратора.

Примеры:

Например, в веб-приложении обрабатываемый запрос может быть сохранен в переменной threadlocal (threading.local), а затем доступен из фильтра для добавления, удаленного IP-адреса и имя пользователя - для LogRecord. В этом случае можно использовать строку формата, чтобы получить вывод:

import logging
from random import choice

class ContextFilter(logging.Filter):
    """
    Это фильтр, который вводит контекстную информацию в log.
    В этой демонстрации используются случайные данные .
    """

    USERS = ['jim', 'fred', 'sheila']
    IPS = ['123.231.231.123', '127.0.0.1', '192.168.0.1']

    def filter(self, record):
        record.ip = choice(ContextFilter.IPS)
        record.user = choice(ContextFilter.USERS)
        return True

if __name__ == '__main__':
    levels = (logging.DEBUG, logging.INFO, logging.WARNING, 
              logging.ERROR, logging.CRITICAL)

    format='%(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s'
    logging.basicConfig(level=logging.DEBUG, format)
    a1 = logging.getLogger('a.b.c')
    a2 = logging.getLogger('d.e.f')

    f = ContextFilter()
    a1.addFilter(f)
    a2.addFilter(f)
    a1.debug('A debug message')
    a1.info('An info message with %s', 'some parameters')
    for x in range(10):
        lvl = choice(levels)
        lvlname = logging.getLevelName(lvl)
        a2.log(lvl, 'A message at %s level with %d %s', lvlname, 2, 'parameters')

Сценарий при запуске выдает что-то вроде:

DEBUG    IP: 127.0.0.1       User: sheila   A debug message
INFO     IP: 123.231.231.123 User: sheila   An info message with some parameters
DEBUG    IP: 127.0.0.1       User: jim      A message at DEBUG level with 2 parameters
ERROR    IP: 123.231.231.123 User: sheila   A message at ERROR level with 2 parameters
DEBUG    IP: 123.231.231.123 User: sheila   A message at DEBUG level with 2 parameters
ERROR    IP: 192.168.0.1     User: jim      A message at ERROR level with 2 parameters
ERROR    IP: 127.0.0.1       User: fred     A message at ERROR level with 2 parameters
CRITICAL IP: 192.168.0.1     User: sheila   A message at CRITICAL level with 2 parameters
ERROR    IP: 192.168.0.1     User: sheila   A message at ERROR level with 2 parameters
INFO     IP: 123.231.231.123 User: fred     A message at INFO level with 2 parameters
ERROR    IP: 192.168.0.1     User: sheila   A message at ERROR level with 2 parameters
ERROR    IP: 192.168.0.1     User: sheila   A message at ERROR level with 2 parameters