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