logging.handlers — Обработчики логов
Исходный код: Lib/logging/handlers.py
В пакете предоставляются следующие полезные обработчики. Обратите внимание, что три обработчика (StreamHandler, FileHandler и NullHandler) фактически определены в модуле logging, но задокументированы здесь вместе с другими обработчиками.
Обработчик потока
Класс StreamHandler, расположенный в базовом пакете logging, отправляет выходные данные лога в потоки, такие как sys.stdout, sys.stderr или любой объект типа файла (или, точнее, любой объект, который поддерживает методы write() и flush()).
-
class logging.StreamHandler(stream=None) -
Возвращает новый экземпляр класса
StreamHandler. Если stream указан, экземпляр будет использовать его для вывода лога; в противном случае будет использован sys.stderr.-
emit(record) -
Если указан форматировщик, он используется для форматирования записи. Затем запись записывается в поток, за которой следует
terminator. Если присутствует информация об исключении, она форматируется с помощьюtraceback.print_exception()и добавляется в поток.
-
flush() -
Очищает поток, вызывая его метод
flush(). Обратите внимание, что методclose()унаследован отHandlerи не производит вывод, поэтому в некоторых случаях может потребоваться явное вызовflush().
-
setStream(stream) -
Устанавливает поток экземпляра в указанное значение, если оно отличается. Старый поток очищается перед установкой нового.
- Параметры
-
stream – Поток, который должен использовать обработчик.
- Возвращает
-
предыдущий поток, если поток был изменен, или None, если он не был.
Новое в версии 3.7.
-
terminator -
Строка, используемая в качестве разделителя при записи отформатированной записи в поток. Значение по умолчанию —
'\n'.Если вы не хотите завершения новой строки, вы можете установить атрибут экземпляра обработчика
terminatorв пустую строку.В более ранних версиях разделитель жестко задавался как
'\n'.Новое в версии 3.2.
-
Обработчик файла
Класс FileHandler, расположенный в базовом пакете logging, отправляет выходные данные лога в файл на диске. Он наследует функциональность вывода от StreamHandler.
-
class logging.FileHandler(filename, mode='a', encoding=None, delay=False, errors=None) -
Возвращает новый экземпляр класса
FileHandler. Указанный файл открывается и используется в качестве потока для записи лога. Если mode не указан, используется'a'. Если encoding неNone, он используется для открытия файла с этим кодированием. Если delay равно True, открытие файла откладывается до первого вызоваemit(). По умолчанию файл растёт неограниченно. Если errors указан, он используется для определения обработки ошибок кодирования.Изменено в версии 3.6: Помимо строковых значений, также принимаются объекты
Pathв качестве аргумента filename.Изменено в версии 3.9: Добавлен параметр errors.
-
close() -
Закрывает файл.
-
emit(record) -
Выводит запись в файл.
Обратите внимание, что если файл был закрыт из-за завершения логгирования при выходе и режим файла — ‘w’, запись не будет выведена (см. bpo-42378).
-
Обработчик отсутствия данных
Новое в версии 3.1.
Класс NullHandler, расположенный в базовом пакете logging, не производит никакого форматирования или вывода. Это по существу обработчик «бездействия» для использования разработчиками библиотек.
-
class logging.NullHandler -
Возвращает новый экземпляр класса
NullHandler.-
emit(record) -
Этот метод ничего не делает.
-
handle(record) -
Этот метод ничего не делает.
-
createLock() -
Этот метод возвращает
Noneдля блокировки, так как нет основного ввода-вывода, для которого требуется сериализация доступа.
-
См. Настройка логгирования для библиотеки для получения дополнительной информации о том, как использовать NullHandler.
Обработчик файлов с отслеживанием изменений
Класс WatchedFileHandler, расположенный в модуле logging.handlers, является обработчиком, который отслеживает файл, в который производится логирование. Если файл изменяется, он закрывается и открывается заново с использованием имени файла.
Изменение файла может произойти из-за использования программ, таких как newsyslog и logrotate, которые выполняют ротацию файлов логов. Этот обработчик, предназначенный для использования в Unix/Linux, отслеживает изменения файла с момента последней записи. (Файл считается изменённым, если изменились его устройство или индексный дескриптор.) Если файл изменился, старый поток файла закрывается, и файл открывается заново для получения нового потока.
Этот обработчик не подходит для использования в Windows, потому что в Windows открытые файлы логов нельзя перемещать или переименовывать — логирование открывает файлы с эксклюзивными блокировками, и поэтому такой обработчик не нужен. Кроме того, ST_INO не поддерживается в Windows; stat() всегда возвращает ноль для этого значения.
-
class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None) -
Возвращает новый экземпляр класса
WatchedFileHandler. Указанный файл открывается и используется как поток для логирования. Если mode не указан, используется'a'. Если encoding неNone, используется для открытия файла с этим кодированием. Если delay истинно, то открытие файла откладывается до первого вызоваemit(). По умолчанию файл увеличивается неограниченно. Если задан errors, он определяет, как обрабатываются ошибки кодирования.Изменено в версии 3.6: Помимо строковых значений, также принимаются объекты
Pathдля аргумента filename.Изменено в версии 3.9: Добавлен параметр errors.
-
reopenIfNeeded() -
Проверяет, изменился ли файл. Если изменился, существующий поток сбрасывается и закрывается, а файл открывается заново, как правило, в качестве предварительной операции перед выводом записи в файл.
Введено в версии 3.6.
-
emit(record) -
Выводит запись в файл, но сначала вызывает
reopenIfNeeded()для повторного открытия файла, если он изменился.
-
Базовый обработчик ротации
Класс BaseRotatingHandler, расположенный в модуле logging.handlers, является базовым классом для обработчиков ротации файлов, RotatingFileHandler и TimedRotatingFileHandler. Вам, скорее всего, не нужно создавать экземпляры этого класса, но у него есть атрибуты и методы, которые вам может потребоваться переопределить.
-
class logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None) -
Параметры такие же, как у
FileHandler. Атрибуты:-
namer -
Если этот атрибут установлен в вызываемый объект, метод
rotation_filename()делегирует вызов этому объекту. Параметры, передаваемые вызываемому объекту, — это те, которые передаются вrotation_filename().Примечание
Функция namer вызывается довольно много раз во время переключения, поэтому она должна быть максимально простой и быстрой. Она также должна возвращать одинаковый результат каждый раз для заданного входного значения, иначе поведение при переключении может работать некорректно.
Также следует учитывать, что при использовании namer необходимо сохранять определённые атрибуты в имени файла, которые используются при ротации. Например,
RotatingFileHandlerожидает наличия набора файлов логов, имена которых содержат последовательные целые числа, чтобы ротация работала как ожидается, иTimedRotatingFileHandlerудаляет старые файлы логов (на основе параметраbackupCountпереданного инициализатору обработчика), определяя самые старые файлы для удаления. Для этого имена файлов должны быть сортируемы по часовой/временной части имени файла, и namer должен учитывать это. (Если требуется namer, который не учитывает эту схему, он должен быть использован в подклассеTimedRotatingFileHandler, который переопределяет методgetFilesToDelete()для соответствия пользовательской схеме именования.)Введено в версии 3.3.
-
rotator -
Если этот атрибут установлен в вызываемый объект, метод
rotate()делегирует вызов этому объекту. Параметры, передаваемые вызываемому объекту, — это те, которые передаются вrotate().Введено в версии 3.3.
-
rotation_filename(default_name) -
Изменяет имя файла лога при ротации.
Это предоставлено для того, чтобы предоставить пользовательское имя файла.
По умолчанию вызывается атрибут 'namer' обработчика, если он вызываемый объект, передавая ему имя по умолчанию. Если атрибут не является вызываемым объектом (по умолчанию
None), имя возвращается без изменений.- Параметры
-
default_name – Имя файла лога по умолчанию.
Введено в версии 3.3.
-
rotate(source, dest) -
При ротации, производит ротацию текущего лога.
По умолчанию вызывается атрибут 'rotator' обработчика, если он вызываемый объект, передавая ему аргументы source и dest. Если атрибут не является вызываемым объектом (по умолчанию
None), source просто переименовывается в destination.- Параметры
-
- source – Имя исходного файла. Обычно это базовое имя файла, например, ‘test.log’.
- dest – Имя файла назначения. Обычно это то, во что исходный файл вращается, например, ‘test.log.1’.
Введено в версии 3.3.
-
Причина существования атрибутов — избавить вас от необходимости создания подклассов — вы можете использовать одни и те же вызываемые объекты для экземпляров RotatingFileHandler и TimedRotatingFileHandler. Если вызываемый объект namer или rotator вызывает исключение, это будет обработано таким же образом, как и любое другое исключение во время вызова emit(), то есть с помощью метода handleError() обработчика.
Если вам нужно внести более существенные изменения в обработку ротации, вы можете переопределить методы.
Пример см. в Использование rotator и namer для настройки обработки ротации логов.
RotatingFileHandler
Класс RotatingFileHandler, расположенный в модуле logging.handlers, поддерживает ротацию файлов журнала на диске.
-
class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None) -
Возвращает новый экземпляр класса
RotatingFileHandler. Указанный файл открывается и используется в качестве потока для ведения журнала. Если mode не указан, используется'a'. Если encoding неNone, он используется для открытия файла с этим кодированием. Если delay истинно, открытие файла откладывается до первого вызоваemit(). По умолчанию файл увеличивается неограниченно. Если указан errors, он определяет, как обрабатывать ошибки кодирования.Вы можете использовать значения maxBytes и backupCount, чтобы позволить файлу переключаться на определенный размер. Когда размер приближается к пределу, файл закрывается, а новый файл молча открывается для вывода. Переключение происходит всякий раз, когда текущий файл журнала приближается к размеру maxBytes; но если maxBytes или backupCount равны нулю, переключение никогда не происходит, поэтому вы обычно хотите установить backupCount по крайней мере на 1 и иметь ненулевое значение maxBytes. Когда backupCount ненулевой, система сохранит старые файлы журнала, добавив к имени файла расширения '.1', '.2' и т. д. Например, с backupCount равным 5 и базовым именем файла
app.log, вы получитеapp.log,app.log.1,app.log.2, вплоть доapp.log.5. Файл, в который записывается информация, всегдаapp.log. Когда этот файл заполняется, он закрывается и переименовывается вapp.log.1, а если файлыapp.log.1,app.log.2, и т. д. существуют, они переименовываются вapp.log.2,app.log.3соответственно.Изменено в версии 3.6: Помимо строковых значений, для аргумента filename также принимаются объекты
Path.Изменено в версии 3.9: Добавлен параметр errors.
-
doRollover() -
Выполняет переключение, как описано выше.
-
emit(record) -
Выводит запись в файл, учитывая переключение, как описано ранее.
-
TimedRotatingFileHandler
Класс TimedRotatingFileHandler, расположенный в модуле logging.handlers, поддерживает ротацию файлов журнала на диске через определённые интервалы времени.
-
class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None) -
Возвращает новый экземпляр класса
TimedRotatingFileHandler. Указанный файл открывается и используется в качестве потока для ведения журнала. При переключении также устанавливается суффикс имени файла. Переключение происходит на основе произведения when и interval.Вы можете использовать when для указания типа interval. Список возможных значений приведён ниже. Обратите внимание, что регистр не учитывается.
Значение
Тип интервала
Использование atTime
'S'Секунды
Игнорируется
'M'Минуты
Игнорируется
'H'Часы
Игнорируется
'D'Дни
Игнорируется
'W0'-'W6'День недели (0=понедельник)
Используется для вычисления начального времени переключения
'midnight'Переключение в полночь, если atTime не указано, иначе в указанное время atTime
Используется для вычисления начального времени переключения
При использовании ротации по дням недели укажите ‘W0’ для понедельника, ‘W1’ для вторника и так далее до ‘W6’ для воскресенья. В этом случае переданное значение для interval не используется.
Система сохранит старые файлы журнала, добавив расширения к имени файла. Расширения основаны на дате и времени, используя формат strftime
%Y-%m-%d_%H-%M-%Sили его часть, в зависимости от интервала переключения.При вычислении следующего времени переключения в первый раз (при создании обработчика) используется последнее время изменения существующего файла журнала, или текущее время, для вычисления следующего переключения.
Если аргумент utc равен true, будут использоваться значения времени в UTC; в противном случае используется местное время.
Если backupCount отличен от нуля, будет сохранено не более backupCount файлов, и если при переключении будет создано больше файлов, самый старый удаляется. Логика удаления использует интервал для определения файлов, которые необходимо удалить, поэтому изменение интервала может оставить старые файлы.
Если delay равен true, открытие файла откладывается до первого вызова
emit().Если atTime не
None, это должен быть объект времениdatetime.time, который определяет время суток, когда происходит переключение, в случаях, когда переключение происходит «в полночь» или «в определенный день недели». Обратите внимание, что в этих случаях значение atTime фактически используется для вычисления начального переключения, а последующие переключения рассчитываются с помощью обычного вычисления интервала.Если errors задано, оно используется для определения способа обработки ошибок кодирования.
Примечание
Вычисление начального времени переключения выполняется при инициализации обработчика. Вычисление последующих времен переключения выполняется только при переключении, и переключение происходит только при выводе данных. Если этого не учитывать, это может привести к некоторым проблемам. Например, если установлен интервал «каждую минуту», это не означает, что вы всегда будете видеть файлы журналов с временами (в имени файла), разделенными минутой; если во время выполнения приложения генерируется вывод журнала чаще, чем раз в минуту, тогда вы можете ожидать увидеть файлы журналов с временами, разделенными минутой. Если же сообщения журнала выводятся только один раз каждые пять минут (например), будут пробелы во времени файлов, соответствующие минутам, в которые не было вывода (и, следовательно, не было переключения).
Изменено в версии 3.4: Добавлен параметр atTime.
Изменено в версии 3.6: Помимо строковых значений, для аргумента filename также принимаются объекты
Path.Изменено в версии 3.9: Добавлен параметр errors.
-
doRollover() -
Выполняет переключение, как описано выше.
-
emit(record) -
Выводит запись в файл, учитывая переключение, как описано выше.
-
getFilesToDelete() -
Возвращает список имён файлов, которые должны быть удалены при переключении. Это абсолютные пути к старейшим резервным файлам журнала, созданным обработчиком.
-
Обработчик сокетов
Класс SocketHandler, расположенный в модуле logging.handlers, отправляет выходные данные регистрации в сетевой сокет. Базовый класс использует TCP-сокет.
-
class logging.handlers.SocketHandler(host, port) -
Возвращает новый экземпляр класса
SocketHandler, предназначенный для взаимодействия с удалённой машиной по адресу host и port.Изменено в версии 3.4: Если
portуказано какNone, создаётся сокет Unix-доменного сокета с использованием значения вhost- в противном случае создаётся TCP-сокет.-
close() -
Закрывает сокет.
-
emit() -
Сериализует словарь атрибутов записи и записывает его в сокет в двоичном формате. Если с сокетом произошла ошибка, пакет отбрасывается. Если соединение ранее было потеряно, восстанавливается соединение. Для десериализации записи на принимающей стороне в
LogRecordиспользуйте функциюmakeLogRecord().
-
handleError() -
Обрабатывает ошибку, которая произошла во время
emit(). Наиболее вероятная причина — потерянное соединение. Закрывает сокет, чтобы мы могли повторить попытку при следующем событии.
-
makeSocket() -
Это фабричный метод, который позволяет подклассам определять точный тип сокета, который они хотят. По умолчанию реализация создаёт TCP-сокет (
socket.SOCK_STREAM).
-
makePickle(record) -
Сериализует словарь атрибутов записи в двоичном формате с префиксом длины и возвращает его, готовый для передачи по сокету. Подробности этой операции эквивалентны:
data = pickle.dumps(record_attr_dict, 1) datalen = struct.pack('>L', len(data)) return datalen + dataОбратите внимание, что сериализации не полностью безопасны. Если вы обеспокоены безопасностью, вы можете переопределить этот метод, чтобы реализовать более безопасный механизм. Например, вы можете подписать сериализации с помощью HMAC и затем проверить их на принимающей стороне, или альтернативно отключить десериализацию глобальных объектов на принимающей стороне.
-
send(packet) -
Отправка закодированной байтовой строки packet в сокет. Формат отправленной байтовой строки описан в документации для
makePickle().Эта функция позволяет частичные отправки, что может произойти, когда сеть занята.
-
createSocket() -
Попытка создания сокета; при неудаче используется алгоритм экспоненциального отката. При первоначальной неудаче обработчик отбросит сообщение, которое он пытался отправить. Когда последующие сообщения обрабатываются тем же экземпляром, он не будет пытаться подключиться, пока не пройдёт некоторое время. Параметры по умолчанию таковы, что начальная задержка составляет одну секунду, и если после этой задержки соединение всё ещё не может быть установлено, обработчик удваивает задержку каждый раз до максимума в 30 секунд.
Это поведение контролируется следующими атрибутами обработчика:
-
retryStart(начальная задержка, по умолчанию 1,0 секунды). -
retryFactor(множитель, по умолчанию 2,0). -
retryMax(максимальная задержка, по умолчанию 30,0 секунд).
Это означает, что если удалённый слушатель запускается после того, как обработчик был использован, вы можете потерять сообщения (поскольку обработчик даже не попытается установить соединение, пока не истечёт задержка, но просто отбрасывает сообщения молча в течение периода задержки).
-
-
Обработчик датаграмм
Класс DatagramHandler, расположенный в модуле logging.handlers, наследуется от SocketHandler для поддержки отправки сообщений регистрации через UDP-сокеты.
-
class logging.handlers.DatagramHandler(host, port) -
Возвращает новый экземпляр класса
DatagramHandler, предназначенный для взаимодействия с удалённой машиной по адресу host и port.Примечание
Поскольку UDP не является потоковым протоколом, между экземпляром этого обработчика и host нет постоянного соединения. По этой причине при использовании сетевого сокета каждый раз при регистрации события может потребоваться выполнить поиск DNS, что может ввести некоторую задержку в систему. Если это вас затрагивает, вы можете выполнить поиск самостоятельно и инициализировать этот обработчик с помощью найденного IP-адреса, а не имени хоста.
Изменено в версии 3.4: Если
portуказано какNone, создаётся сокет Unix-доменного сокета с использованием значения вhost- в противном случае создаётся UDP-сокет.-
emit() -
Сериализует словарь атрибутов записи и записывает его в сокет в двоичном формате. Если с сокетом произошла ошибка, пакет отбрасывается. Для десериализации записи на принимающей стороне в
LogRecordиспользуйте функциюmakeLogRecord().
-
makeSocket() -
Фабричный метод
SocketHandlerздесь переопределён для создания UDP-сокета (socket.SOCK_DGRAM).
-
send(s) -
Отправка закодированной байтовой строки в сокет. Формат отправленной байтовой строки описан в документации для
SocketHandler.makePickle().
-
Обработчик SysLog
Класс SysLogHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений регистрации в удаленный или локальный Unix syslog.
-
class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM) -
Возвращает новый экземпляр класса
SysLogHandler, предназначенный для взаимодействия с удаленной Unix-машиной, адрес которой задаётся параметром address в формате(host, port)кортежа. Если address не указан, используется('localhost', 514). Адрес используется для открытия сокета. В качестве альтернативы кортежу(host, port)можно указать адрес в виде строки, например, ‘/dev/log’. В этом случае используется сокет Unix-доменной системы для отправки сообщения в syslog. Если facility не указан, используетсяLOG_USER. Тип открытого сокета зависит от аргумента socktype, который по умолчанию равенsocket.SOCK_DGRAMи, таким образом, открывает сокет UDP. Для открытия сокета TCP (для использования с более новыми демонами syslog, такими как rsyslog), укажите значениеsocket.SOCK_STREAM.Обратите внимание, что если ваш сервер не прослушивает UDP-порт 514,
SysLogHandlerможет работать некорректно. В этом случае проверьте, какой адрес следует использовать для сокета доменной системы — он зависит от системы. Например, в Linux это обычно ‘/dev/log’, но в OS/X это ‘/var/run/syslog’. Вам нужно проверить вашу платформу и использовать соответствующий адрес (вам может потребоваться выполнить эту проверку во время выполнения, если ваше приложение должно работать на нескольких платформах). В Windows, скорее всего, необходимо использовать UDP-вариант.Примечание
В macOS 12.x (Monterey) Apple изменила поведение своего демона syslog — он больше не прослушивает сокет доменной системы. Поэтому вы не можете ожидать, что
SysLogHandlerбудет работать на этой системе.Дополнительную информацию см. в gh-91070.
Изменено в версии 3.2: Добавлен параметр socktype.
-
close() -
Закрывает сокет с удалённым хостом.
-
emit(record) -
Запись форматируется и отправляется на сервер syslog. Если есть информация об исключении, она не отправляется на сервер.
Изменено в версии 3.2.1: (См.: bpo-12168.) В более ранних версиях сообщение, отправленное демонам syslog, всегда завершалось байтом NUL, потому что ранние версии этих демонов ожидали NUL-завершённое сообщение — даже если это не указано в соответствующем спецификации (RFC 5424). Более новые версии этих демонов не ожидают байт NUL, но удаляют его, если он есть, а ещё более новые демоны (которые более точно следуют RFC 5424) передают байт NUL как часть сообщения.
Чтобы упростить обработку сообщений syslog в условиях различных поведений демонов, добавление байта NUL стало настраиваемым через атрибут класса
append_nul. По умолчанию он равенTrue(сохраняя предыдущее поведение), но может быть установлен наFalseв экземпляреSysLogHandlerдля того, чтобы этот экземпляр не добавлял терминатор NUL.Изменено в версии 3.3: (См.: bpo-12419.) В более ранних версиях не было возможности использования префикса «ident» или «tag» для идентификации источника сообщения. Теперь это можно указать с помощью атрибута класса, по умолчанию равного
""для сохранения предыдущего поведения, но который может быть переопределён в экземпляреSysLogHandlerдля того, чтобы этот экземпляр предварял каждое обрабатываемое сообщение идентификатором. Обратите внимание, что предоставленный идентификатор должен быть текстовым, а не байтовым, и добавляется к сообщению точно так, как есть.
-
encodePriority(facility, priority) -
Кодирует facility и приоритет в целое число. Вы можете передавать строки или целые числа — если передаются строки, используются внутренние словари сопоставления для их преобразования в целые числа.
Символьные значения
LOG_определены вSysLogHandlerи соответствуют значениям, определённым в заголовочном файлеsys/syslog.h.Приоритеты
Имя (строка)
Символическое значение
alertLOG_ALERT
critилиcriticalLOG_CRIT
debugLOG_DEBUG
emergилиpanicLOG_EMERG
errилиerrorLOG_ERR
infoLOG_INFO
noticeLOG_NOTICE
warnилиwarningLOG_WARNING
Facilities
Имя (строка)
Символическое значение
authLOG_AUTH
authprivLOG_AUTHPRIV
cronLOG_CRON
daemonLOG_DAEMON
ftpLOG_FTP
kernLOG_KERN
lprLOG_LPR
mailLOG_MAIL
newsLOG_NEWS
syslogLOG_SYSLOG
userLOG_USER
uucpLOG_UUCP
local0LOG_LOCAL0
local1LOG_LOCAL1
local2LOG_LOCAL2
local3LOG_LOCAL3
local4LOG_LOCAL4
local5LOG_LOCAL5
local6LOG_LOCAL6
local7LOG_LOCAL7
-
mapPriority(levelname) -
Преобразует имя уровня регистрации в имя приоритета syslog. Возможно, вам нужно будет переопределить этот метод, если вы используете пользовательские уровни или если алгоритм по умолчанию не подходит для ваших нужд. По умолчанию алгоритм сопоставляет
DEBUG,INFO,WARNING,ERRORиCRITICALс эквивалентными именами syslog, а все остальные имена уровней — со строкой ‘warning’.
-
Обработчик NTEventLog
Класс NTEventLogHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений логирования в локальный журнал событий Windows NT, Windows 2000 или Windows XP. Для его использования необходимо установить расширения Win32 для Python Марка Хаммонда.
-
class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application') -
Возвращает новый экземпляр класса
NTEventLogHandler. Параметр appname используется для определения имени приложения в журнале событий. Используя это имя, создаётся соответствующая запись в реестре. Параметр dllname должен содержать полный путь к .dll или .exe файлу, содержащему определения сообщений для хранения в журнале (если не указано, используется'win32service.pyd', который установлен с расширениями Win32 и содержит некоторые базовые определения сообщений-заменителей. Обратите внимание, что использование этих заменителей сделает журналы событий большими, так как весь исходный текст сообщения будет храниться в журнале. Если вы хотите более компактные журналы, необходимо указать имя собственного .dll или .exe файла, содержащего определения сообщений, которые вы хотите использовать в журнале событий). Параметр logtype может принимать значения'Application','System'или'Security', и по умолчанию равен'Application'.-
close() -
В этом месте вы можете удалить имя приложения из реестра как источника записей журнала событий. Однако, если вы сделаете это, вы не сможете увидеть события так, как задумывалось в Просмотрщике журналов событий - ему необходимо получить доступ к реестру, чтобы получить имя .dll. Текущая версия этого не делает.
-
emit(record) -
Определяет идентификатор сообщения, категорию события и тип события, а затем записывает сообщение в журнал событий NT.
-
getEventCategory(record) -
Возвращает категорию события для записи. Переопределите этот метод, если хотите указать свои собственные категории. Эта версия возвращает 0.
-
getEventType(record) -
Возвращает тип события для записи. Переопределите этот метод, если хотите указать свои собственные типы. Эта версия выполняет отображение, используя атрибут typemap обработчика, который настроен в
__init__()на словарь, содержащий отображения дляDEBUG,INFO,WARNING,ERRORиCRITICAL. Если вы используете свои собственные уровни, вам необходимо будет либо переопределить этот метод, либо поместить подходящий словарь в атрибут typemap обработчика.
-
getMessageID(record) -
Возвращает идентификатор сообщения для записи. Если вы используете свои собственные сообщения, вы можете сделать это, сделав msg, переданный в логгер, идентификатором, а не строкой формата. Затем здесь вы можете использовать поиск в словаре для получения идентификатора сообщения. Эта версия возвращает 1, что является базовым идентификатором сообщения в
win32service.pyd.
-
Обработчик SMTP
Класс SMTPHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений логирования на электронный адрес через SMTP.
-
class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0) -
Возвращает новый экземпляр класса
SMTPHandler. Экземпляр инициализируется адресами отправителя и получателя, а также строкой темы письма. Параметр toaddrs должен быть списком строк. Для указания нестандартного порта SMTP используйте формат кортежа (хост, порт) для аргумента mailhost. Если вы используете строку, используется стандартный порт SMTP. Если ваш SMTP-сервер требует аутентификации, вы можете указать кортеж (имя пользователя, пароль) для аргумента credentials.Для указания использования защищённого протокола (TLS) передайте кортеж в аргумент secure. Это будет использоваться только при наличии аутентификационных данных. Кортеж должен быть либо пустым кортежем, либо кортежем с одним значением — именем файла ключа, или кортежем из двух значений — именами файла ключа и файла сертификата. (Этот кортеж передаётся методу
smtplib.SMTP.starttls().)Таймаут для связи с SMTP-сервером может быть задан с помощью аргумента timeout.
Добавлена в версии 3.3: Аргумент timeout был добавлен.
-
emit(record) -
Форматирует запись и отправляет её указанным адресатам.
-
getSubject(record) -
Если вы хотите указать строку темы, зависящую от записи, переопределите этот метод.
-
Обработчик памяти
Класс MemoryHandler, расположенный в модуле logging.handlers, поддерживает буферизацию записей логирования в памяти, периодически очищая их в обработчик target. Очистка происходит всякий раз, когда буфер заполняется или когда появляется событие определённого уровня важности или выше.
MemoryHandler является подклассом более общего класса BufferingHandler, который является абстрактным классом. Он буферизует записи логирования в памяти. Каждый раз при добавлении записи в буфер вызывается shouldFlush(), чтобы проверить, нужно ли очистить буфер. Если нужно, то flush() должен выполнить очистку.
-
class logging.handlers.BufferingHandler(capacity) -
Инициализирует обработчик с буфером заданной ёмкости. Здесь ёмкость означает количество записей логирования, буферизуемых.
-
emit(record) -
Добавляет запись в буфер. Если
shouldFlush()возвращает true, вызовитеflush()для обработки буфера.
-
flush() -
Вы можете переопределить его, чтобы реализовать пользовательское поведение очистки. Эта версия просто очищает буфер.
-
shouldFlush(record) -
Возвращает
Trueесли буфер заполнен. Этот метод можно переопределить для реализации пользовательских стратегий очистки.
-
-
class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True) -
Возвращает новый экземпляр класса
MemoryHandler. Экземпляр инициализируется размером буфера capacity (число буферизованных записей). Если flushLevel не указан, используетсяERROR. Если target не указан, целевой обработчик необходимо будет задать с помощьюsetTarget(), прежде чем этот обработчик сможет выполнять полезную работу. Если flushOnClose задано какFalse, буфер не очищается при закрытии обработчика. Если не задано или задано какTrue, то произойдёт очистка буфера при закрытии обработчика.Изменено в версии 3.6: Параметр flushOnClose был добавлен.
-
close() -
Вызывает
flush(), устанавливает целевой обработчик вNoneи очищает буфер.
-
flush() -
Для обработчика
MemoryHandlerочистка означает просто отправку буферизованных записей в целевой обработчик, если он есть. Буфер также очищается в этом случае. Переопределите, если хотите другое поведение.
-
setTarget(target) -
Устанавливает целевой обработчик для данного обработчика.
-
shouldFlush(record) -
Проверяет, заполнен ли буфер или есть запись уровня flushLevel или выше.
-
HTTPHandler
Класс HTTPHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений регистрации на веб-сервер, используя либо GET или POST семантику.
-
class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None) -
Возвращает новый экземпляр класса
HTTPHandler. Параметр host может быть в форматеhost:port, если необходимо использовать определённый номер порта. Если method не указан, используетсяGET. Если secure равно true, будет использовано HTTPS-соединение. Параметр context может быть установлен на экземплярssl.SSLContextдля настройки параметров SSL, используемых для HTTPS-соединения. Если указаны credentials, они должны быть кортежем из двух элементов: идентификатора пользователя и пароля, которые будут добавлены в заголовок HTTP ‘Authorization’ с использованием аутентификации Basic. Если вы указываете данные авторизации, вы также должны указать secure=True, чтобы ваши данные пользователя и пароль не передавались в открытом виде.Изменено в версии 3.5: Добавлен параметр context.
-
mapLogRecord(record) -
Возвращает словарь, основанный на
record, который должен быть закодирован в URL и отправлен на веб-сервер. Базовая реализация просто возвращаетrecord.__dict__. Этот метод можно переопределить, если, например, на веб-сервер необходимо отправить только подмножествоLogRecord, или если требуется более специфическая настройка того, что отправляется на сервер.
-
emit(record) -
Отправляет запись на веб-сервер в виде закодированного в URL словаря. Для преобразования записи в словарь для отправки используется метод
mapLogRecord().
Примечание
Поскольку подготовка записи для отправки на веб-сервер отличается от операции форматирования в общем случае, использование
setFormatter()для указанияFormatterдляHTTPHandlerне имеет эффекта. Вместо вызоваformat(), этот обработчик вызываетmapLogRecord(), а затемurllib.parse.urlencode()для кодирования словаря в формате, подходящем для отправки на веб-сервер. -
QueueHandler
Новое в версии 3.2.
Класс QueueHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений регистрации в очередь, например, реализованные в модулях queue или multiprocessing.
Вместе с классом QueueListener, QueueHandler может использоваться для выполнения задач обработчиков в отдельном потоке от потока, выполняющего регистрацию. Это важно в веб-приложениях и других приложениях службы, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, в то время как любые потенциально медленные операции (например, отправка электронного письма через SMTPHandler) выполняются в отдельном потоке.
-
class logging.handlers.QueueHandler(queue) -
Возвращает новый экземпляр класса
QueueHandler. Экземпляр инициализируется очередью для отправки сообщений. Параметр queue может быть любым объектом типа очереди; он используется как есть методомenqueue(), который должен знать, как отправлять сообщения в неё. Очередь не обязана иметь API отслеживания задач, что означает, что вы можете использовать экземплярыSimpleQueueдля queue.Примечание
Если вы используете
multiprocessing, следует избегать использованияSimpleQueueи вместо этого использоватьmultiprocessing.Queue.-
emit(record) -
Добавляет результат подготовки записи LogRecord в очередь. Если произойдет исключение (например, потому что ограниченная очередь заполнилась), вызывается метод
handleError()для обработки ошибки. Это может привести к тому, что запись будет бесшумно отброшена (еслиlogging.raiseExceptionsравноFalse), или к выводу сообщения вsys.stderr(еслиlogging.raiseExceptionsравноTrue).
-
prepare(record) -
Подготавливает запись к очереди. Объект, возвращаемый этим методом, добавляется в очередь.
Базовая реализация форматирует запись для объединения сообщения, аргументов, исключения и информации о стеке, если они присутствуют. Она также удаляет несериализуемые элементы из записи на месте. В частности, она перезаписывает атрибуты записи
msgиmessageобъединённым сообщением (полученным путём вызова метода обработчикаformat()), и устанавливает атрибутыargs,exc_infoиexc_textвNone.Вы можете переопределить этот метод, если хотите преобразовать запись в словарь или строку JSON, или отправить изменённую копию записи, оставив оригинальную нетронутой.
Примечание
Базовая реализация форматирует сообщение с аргументами, устанавливает атрибуты
messageиmsgв отформатированное сообщение и устанавливает атрибутыargsиexc_textвNone, чтобы разрешить сериализацию и предотвратить дальнейшие попытки форматирования. Это означает, что обработчик на сторонеQueueListenerне будет иметь информации для выполнения пользовательского форматирования, например, исключений. Вы можете захотеть переопределить классQueueHandlerи переопределить этот метод, чтобы, например, не устанавливатьexc_textвNone. Обратите внимание, что измененияmessage/msg/argsсвязаны с обеспечением сериализуемости записи, и вы можете или не можете избежать этого в зависимости от того, сериализуемы ли вашиargs. (Обратите внимание, что вам необходимо учитывать не только свой код, но и код любых используемых вами библиотек.)
-
enqueue(record) -
Добавляет запись в очередь, используя
put_nowait(); вы можете переопределить этот метод, если хотите использовать блокирующее поведение, таймаут или настраиваемую реализацию очереди.
-
listener -
При создании через конфигурацию с помощью
dictConfig(), этот атрибут будет содержать экземплярQueueListenerдля использования с этим обработчиком. В противном случае он будетNone.Новое в версии 3.12.
-
QueueListener
Новое в версии 3.2.
Класс QueueListener, расположенный в модуле logging.handlers, поддерживает получение сообщений регистрации из очереди, таких как те, которые реализованы в модулях queue или multiprocessing. Сообщения получаются из очереди в внутреннем потоке и передаются в том же потоке одному или нескольким обработчикам для обработки. Хотя QueueListener сам по себе не является обработчиком, он документирован здесь, потому что работает в паре с QueueHandler.
Вместе с классом QueueHandler, QueueListener может использоваться, чтобы позволить обработчикам выполнять свою работу в отдельном потоке от того, который выполняет регистрацию. Это важно в веб-приложениях и других приложениях-сервисах, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, в то время как любые потенциально медленные операции (например, отправка письма по электронной почте через SMTPHandler) выполняются в отдельном потоке.
-
class logging.handlers.QueueListener(queue, *handlers, respect_handler_level=False) -
Возвращает новый экземпляр класса
QueueListener. Экземпляр инициализируется очередью для отправки сообщений и списком обработчиков, которые будут обрабатывать записи, помещенные в очередь. Очередь может быть любым объектом типа очереди; она передается как есть методуdequeue(), который должен знать, как получать сообщения из неё. Очередь не *обязана* иметь API отслеживания задач (хотя он используется, если доступен), что означает, что вы можете использовать экземплярыSimpleQueueдля *очереди*.Примечание
Если вы используете
multiprocessing, вам следует избегать использованияSimpleQueueи вместо этого использоватьmultiprocessing.Queue.Если
respect_handler_levelравноTrue, уровень обработчика учитывается (в сравнении с уровнем сообщения) при принятии решения о передаче сообщений этому обработчику; в противном случае поведение аналогично предыдущим версиям Python — каждый раз передавать каждое сообщение каждому обработчику.Изменено в версии 3.5: Аргумент
respect_handler_levelбыл добавлен.-
dequeue(block) -
Извлекает запись и возвращает её, необязательно блокируя.
Базовая реализация использует
get(). Вы можете переопределить этот метод, если хотите использовать таймауты или работать с настраиваемыми реализациями очереди.
-
prepare(record) -
Подготавливает запись для обработки.
Эта реализация просто возвращает переданную запись. Вы можете переопределить этот метод, если вам нужно выполнить какие-либо пользовательские преобразования или манипуляции с записью перед передачей её обработчикам.
-
handle(record) -
Обрабатывает запись.
Это просто перебирает обработчики, предлагая им обработать запись. Фактический объект, передаваемый обработчикам, — это тот, который возвращается из
prepare().
-
start() -
Запускает слушатель.
Это запускает фоновый поток для мониторинга очереди на предмет записей журналов для обработки.
-
stop() -
Останавливает слушатель.
Это просит поток завершиться и затем ждёт его завершения. Обратите внимание, что если вы не вызываете это до завершения вашего приложения, могут остаться некоторые записи в очереди, которые не будут обработаны.
-
enqueue_sentinel() -
Записывает метку в очередь, чтобы сообщить слушателю о выходе. Эта реализация использует
put_nowait(). Вы можете переопределить этот метод, если хотите использовать таймауты или работать с настраиваемыми реализациями очереди.Новое в версии 3.3.
-
См. также
-
Modulelogging -
Справочник по API модуля регистрации.
-
Modulelogging.config -
API конфигурации для модуля регистрации.
© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/logging.handlers.html