Вопрос простой, что подразумевается под Handler . Я знаю, что по-английски Handler — это своего рода Handler . Но я не могу понять концепцию, стоящую за этим, если она следует какому-то шаблону проектирования или что-то в этом роде. Будь то синхронный или асинхронный и т.д.
Мой вопрос возникает из-за использования ведения журнала Python . В котором можно настроить несколько обработчиков для отправки журналов на разные сайты.
'handlers': {
'wsgi': {
'class': 'logging.StreamHandler',
'stream': 'ext://flask.logging.wsgi_errors_stream',
'formatter': 'default'
},
'info_file_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'logs/info.log',
'formatter': 'default',
'maxBytes': 485760,
'backupCount': 5,
'encoding': 'utf8'
}
Если у кого-то есть хорошее объяснение и пример, добро пожаловать. На обработчике нет тега (и я не могу его создать из-за низкой репутации).
A
Handler
— довольно неоднозначное понятие в том смысле, что нет однозначного определения ни что это такое, ни как оно должно быть построено, говоря только о Python , в документации нет точного определения и терминHandler
используется во многих классах и объектах без указания единого шаблона, самое большее, мы можем обобщить то, что вы уже знаете, что aHandler
является «обработчиком», чем-то, что способно «получать» событие, сообщение и т. д. и действовать в соответствии с ним.Но в контексте модуля
logging
мы можем указать немного больше, чем то, что aHandler
, давайте сначала посмотрим, как работает информационный журнал:Logger
, объекта, с помощью которого мы можем определить несколько сообщений для «логирования» во время выполнения наших скриптов.warning()
,error()
,log()
и т.д. Все они заканчиваются вызовом внутренней функции_log()
._log()
создает «запись», которую мы хотим сохранить, и, наконец, вызывает методcallHandlers()
.callHandlers()
, как видно из его названия, выполняет итерацию поHandlers
ранее сконфигурированному списку и вызывает методhandle()
.Важно отметить, что при этом
Logger
мы абстрагируемся от того, «куда» и «как» будут записываться сообщения, поэтому имеемHandler
, с некоторыми характеристиками:logging.Handler
logging.Handler
имеет фундаментальный метод, то естьhandle()
всеHandlers
наследуют этот метод, который в конечном итоге вызывает другой, не реализованный в этом классе, называемыйemit()
.emit()
это метод, который должен реализовать каждыйHandler
унаследованный от ,logging.Handler
и который инкапсулирует окончательную логику для обработки записи журнала, сохранения ее в определенном файле, отправки по сети, регистрации ее как системного события и т. д.emit()
иHandler
, в конечном счете, именно они управляют тем, «где» и «как» будут записываться сообщения.В этом контексте мы могли бы сказать, что a
Handler
— это объект, отвечающий за конкретную задачу, который также имеет определенный интерфейс, вызываемый иерархически вышестоящим объектом, который «делегирует» ему часть работы либо для причине делегирования обязанностей или для обеспечения функциональной расширяемости.В качестве примера добавлю определение
Handler
самого простого и элементарного elNullHandler
:Вы можете видеть, что определены только вышеупомянутые методы
handle()
и (пусто)emit()
. Примечание: этоcreateLock()
означает переопределение стандартного механизма блокировки,Handler
поскольку в этом случае блокировка любого вида не требуется.