Содержание страницы
16.8. logging.handlers – Обработчики логирования¶logging.handlers – Logging handlers
Исходный код: Lib/logging/handlers.py
В пакете предоставлены следующие полезные обработчики. Обратите внимание, что три из них (StreamHandler, FileHandler и NullHandler) на самом деле определены в самом модуле logging, но описаны здесь вместе с остальными обработчиками.
16.8.1. StreamHandler¶
Класс StreamHandler, расположенный в основном пакете logging, отправляет вывод логирования в такие потоки, как sys.stdout, sys.stderr или любой файлоподобный объект (или, точнее, любой объект, поддерживающий методы write() и flush()).
- class logging.StreamHandler(stream=None)¶
Возвращает новый экземпляр класса StreamHandler. Если указан параметр поток данных, экземпляр использует его для вывода логирования; в противном случае используется sys.stderr.
- emit(record)¶
Если указан форматтер, он форматирует запись. Затем запись записывается в поток с завершающим символом. Если присутствует информация об исключении, она форматируется с помощью traceback.print_exception() и добавляется в поток.
Изменено в версии 3.2: Теперь у класса StreamHandler есть атрибут terminator, значение по умолчанию '\n', который используется как завершитель при записи форматированной записи в поток. Если вы не хотите завершать переводом строки, вы можете установить атрибут terminator экземпляра обработчика в пустую строку. В предыдущих версиях завершитель был жёстко задан как '\n'.
16.8.2. FileHandler¶
Класс FileHandler, расположенный в основном пакете logging, отправляет вывод логирования в файл на диске. Он наследует функциональность вывода от StreamHandler.
- class logging.FileHandler(filename, mode='a', encoding=None, delay=False)¶
Возвращает новый экземпляр класса FileHandler. Указанный файл открывается и используется как поток для логирования. Если mode не указан, используется 'a'. Если encoding не равен None, файл открывается с указанной кодировкой. Если delay равен true, открытие файла откладывается до первого вызова emit(). По умолчанию файл растёт бесконечно.
- close()¶
Закрывает файл.
- emit(record)¶
Выводит запись в файл.
16.8.3. NullHandler¶
Новое в версии 3.1.
Класс NullHandler, расположенный в основном пакете logging, не выполняет никакого форматирования или вывода. По сути это обработчик-пустышка, предназначенный для разработчиков библиотек.
- class logging.NullHandler¶
Возвращает новый экземпляр класса NullHandler.
- emit(record)¶
Этот метод ничего не делает.
- handle(record)¶
Этот метод ничего не делает.
- createLock()¶
Этот метод возвращает None для блокировки, поскольку нет базового ввода-вывода, доступ к которому необходимо синхронизировать.
Смотрите Настройка логирования для библиотеки для получения дополнительной информации об использовании NullHandler.
16.8.4. WatchedFileHandler¶
The WatchedFileHandler class, located in the logging.handlers module, is a FileHandler which watches the file it is logging to. If the file changes, it is closed and reopened using the file name.
Файл может измениться из-за использования таких программ, как newsyslog и logrotate, которые выполняют ротацию файлов журнала. Этот обработчик, предназначенный для использования в Unix/Linux, следит, не изменился ли файл с момента последнего вызова emit. (Считается, что файл изменился, если изменились его устройство или inode.) Если файл изменился, старый поток файла закрывается, а файл открывается для получения нового потока.
Этот обработчик не подходит для использования в Windows, потому что в Windows открытые файлы журналов нельзя перемещать или переименовывать – логирование открывает файлы с эксклюзивными блокировками – поэтому нет необходимости в таком обработчике. Кроме того, ST_INO не поддерживается в Windows; stat() всегда возвращает ноль для этого значения.
- class logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]])¶
Возвращает новый экземпляр класса WatchedFileHandler. Указанный файл открывается и используется как поток для логирования. Если mode не указан, используется 'a'. Если encoding не равен None, файл открывается с указанной кодировкой. Если delay равен true, открытие файла откладывается до первого вызова emit(). По умолчанию файл растёт бесконечно.
- emit(record)¶
Выводит запись в файл, но сначала проверяет, изменился ли файл. Если изменился, существующий поток сбрасывается и закрывается, а файл открывается заново, после чего запись выводится в файл.
16.8.5. BaseRotatingHandler¶
Класс BaseRotatingHandler, расположенный в модуле logging.handlers, является базовым классом для ротационных файловых обработчиков, RotatingFileHandler и TimedRotatingFileHandler. Обычно не требуется создавать экземпляры этого класса, однако он содержит атрибуты и методы, которые может понадобиться переопределить.
- class logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False)¶
Параметры такие же, как у FileHandler. Атрибуты:
- namer¶
Если этому атрибуту присвоен вызываемый объект, метод rotation_filename() делегирует вызов этому объекту. Параметры, передаваемые вызываемому объекту, – это те же параметры, что передаются методу rotation_filename().
Примечание
Функция namer вызывается довольно много раз во время ротации, поэтому она должна быть максимально простой и быстрой. Она также должна возвращать одинаковый результат для одного и того же входного значения, иначе поведение ротации может не соответствовать ожидаемому.
Новое в версии 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 – имя файла назначения. Обычно это то, во что ротируется source, например ‘test.log.1’.
Новое в версии 3.3.
Атрибуты существуют для того, чтобы избавить от необходимости создавать подклассы: можно использовать одни и те же вызываемые объекты для экземпляров RotatingFileHandler и TimedRotatingFileHandler. Если какой-либо из вызываемых объектов namer или rotator возбуждает исключение, оно обрабатывается так же, как любое другое исключение при вызове emit(), то есть через метод handleError() обработчика.
Если требуется внести более существенные изменения в обработку ротации, можно переопределить методы.
Пример см. в Использование rotator и namer для настройки обработки ротации журналов.
16.8.6. RotatingFileHandler¶
Класс RotatingFileHandler, расположенный в модуле logging.handlers, поддерживает ротацию файлов журнала на диске.
- class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)¶
Возвращает новый экземпляр класса RotatingFileHandler. Указанный файл открывается и используется как поток для журналирования. Если mode не указан, используется 'a'. Если encoding не равен None, файл открывается с указанной кодировкой. Если delay равен истине, открытие файла откладывается до первого вызова emit(). По умолчанию файл растёт бесконечно.
You can use the maxBytes and backupCount values to allow the file to rollover at a predetermined size. When the size is about to be exceeded, the file is closed and a new file is silently opened for output. Rollover occurs whenever the current log file is nearly maxBytes in length; if either of maxBytes or backupCount is zero, rollover never occurs. If backupCount is non-zero, the system will save old log files by appending the extensions ‘.1’, ‘.2’ etc., to the filename. For example, with a backupCount of 5 and a base file name of app.log, you would get app.log, app.log.1, app.log.2, up to app.log.5. The file being written to is always app.log. When this file is filled, it is closed and renamed to app.log.1, and if files app.log.1, app.log.2, etc. exist, then they are renamed to app.log.2, app.log.3 etc. respectively.
- doRollover()¶
Выполняет ротацию, как описано выше.
- emit(record)¶
Записывает запись (record) в файл, выполняя при необходимости ротацию, как описано ранее.
16.8.7. TimedRotatingFileHandler¶
Класс TimedRotatingFileHandler, расположенный в модуле logging.handlers, поддерживает ротацию файлов журнала на диске через заданные интервалы времени.
- class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)¶
Возвращает новый экземпляр класса TimedRotatingFileHandler. Указанный файл открывается и используется как поток для журналирования. При ротации также устанавливается суффикс имени файла. Ротация происходит на основе произведения when и interval.
Параметр when указывает тип interval. Список возможных значений приведён ниже. Обратите внимание, что регистр не учитывается.
Значение Тип интервала 'S' Секунды 'M' Минуты 'H' Часы 'D' Дни 'W0'-'W6' День недели (0=понедельник) 'midnight' Переключение в полночь При использовании ротации по дням недели укажите 'W0' для понедельника, 'W1' для вторника и так далее до 'W6' для воскресенья. В этом случае значение, переданное для interval, не используется.
Система будет сохранять старые файлы журнала, добавляя расширения к имени файла. Расширения основаны на дате и времени, с использованием формата strftime %Y-%m-%d_%H-%M-%S или его начальной части, в зависимости от интервала ротации.
При первом вычислении времени следующей ротации (при создании обработчика) используется время последнего изменения существующего файла журнала или, в противном случае, текущее время, чтобы определить, когда произойдёт следующая ротация.
Если аргумент utc равен true, используется время в UTC; в противном случае используется местное время.
Если backupCount не равен нулю, сохраняется не более backupCount файлов; если при ротации должно быть создано больше файлов, самый старый удаляется. Логика удаления использует интервал для определения того, какие файлы нужно удалить, поэтому изменение интервала может привести к тому, что старые файлы останутся.
Если delay равен true, открытие файла откладывается до первого вызова emit().
Если atTime не равен None, он должен быть экземпляром datetime.time, который задает время суток, когда происходит переключение, для случаев, когда переключение должно происходить «в полночь» или «в определенный день недели».
Изменено в версии 3.4: Добавлен параметр atTime.
- doRollover()¶
Выполняет ротацию, как описано выше.
- emit(record)¶
Выводит запись в файл, обеспечивая ротацию, как описано выше.
16.8.8. SocketHandler¶
Класс SocketHandler, находящийся в модуле logging.handlers, отправляет вывод журнала в сетевой сокет. Базовый класс использует TCP-сокет.
- class logging.handlers.SocketHandler(host, port)¶
Возвращает новый экземпляр класса SocketHandler, предназначенного для взаимодействия с удаленной машиной, адрес которой задается host и port.
Изменено в версии 3.4: Если port указан как None, создается доменный сокет Unix с использованием значения host – в противном случае создается TCP-сокет.
- close()¶
Закрывает сокет.
- emit()¶
Сериализует словарь атрибутов записи и записывает его в сокет в dвоичном формате. Если возникла ошибка с сокетом, пакет молча отбрасывается. Если соединение было ранее потеряно, восстанавливает его. Чтобы десериализовать запись на принимающей стороне в объект LogRecord, используйте функцию makeLogRecord().
- handleError()¶
Обрабатывает ошибку, возникшую во время emit(). Наиболее вероятная причина – потеря соединения. Закрывает сокет, чтобы можно было повторить попытку при следующем событии.
- makeSocket()¶
Это фабричный метод, позволяющий подклассам определять точный тип сокета, который они хотят. Реализация по умолчанию создает TCP-сокет (socket.SOCK_STREAM).
- makePickle(record)¶
Сериализует словарь атрибутов записи в двоичном формате с префиксом длины и возвращает его готовым к передаче через сокет.
Обратите внимание, что модуль pickle не является полностью безопасным. Если вас беспокоит безопасность, вы можете переопределить этот метод, чтобы реализовать более надёжный механизм. Например, можно подписывать данные с помощью HMAC и проверять подпись на принимающей стороне, либо отключить десериализацию глобальных объектов на принимающей стороне.
- send(packet)¶
Отправляет сериализованную с помощью pickle строку packet в сокет. Эта функция допускает частичную отправку, которая может произойти, когда сеть занята.
- createSocket()¶
Пытается создать сокет; в случае неудачи применяет алгоритм экспоненциальной отсрочки. При первой неудаче обработчик отбрасывает сообщение, которое пытался отправить. Когда последующие сообщения обрабатываются тем же экземпляром, он не будет пытаться установить соединение, пока не пройдёт некоторое время. Значения параметров по умолчанию таковы, что начальная задержка составляет одну секунду, и если после этой задержки соединение всё ещё не может быть установлено, обработчик будет удваивать задержку каждый раз вплоть до максимума в 30 секунд.
Это поведение управляется следующими атрибутами обработчика:
- retryStart (начальная задержка, по умолчанию 1.0 секунды).
- retryFactor (множитель, по умолчанию 2.0).
- retryMax (максимальная задержка, по умолчанию 30.0 секунд).
Это означает, что если удалённый слушатель запускается после того, как обработчик уже использовался, возможна потеря сообщений (поскольку обработчик даже не будет пытаться установить соединение, пока не истечёт задержка, а будет просто молча отбрасывать сообщения в течение этого периода).
16.8.9. DatagramHandler¶
Класс DatagramHandler, находящийся в модуле logging.handlers, наследует от SocketHandler для поддержки отправки сообщений журнала через UDP-сокеты.
- class logging.handlers.DatagramHandler(host, port)¶
Возвращает новый экземпляр класса DatagramHandler, предназначенного для взаимодействия с удаленной машиной, адрес которой задается host и port.
Изменено в версии 3.4: Если port указан как None, создается доменный сокет Unix с использованием значения host – в противном случае создается TCP-сокет.
- emit()¶
Сериализует словарь атрибутов записи и записывает его в сокет в dвоичном формате. Если возникла ошибка с сокетом, пакет молча отбрасывается. Чтобы десериализовать запись на принимающей стороне в объект LogRecord, используйте функцию makeLogRecord().
- makeSocket()¶
Фабричный метод SocketHandler здесь переопределен для создания UDP-сокета (socket.SOCK_DGRAM).
- send(s)¶
Отправляет сериализованную с помощью pickle строку в сокет.
16.8.10. SysLogHandler¶
Класс SysLogHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений журнала на удалённый или локальный syslog Unix.
- 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’. В этом случае для отправки сообщения syslog используется сокет домена Unix. Если 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.
Изменено в версии 3.2: добавлен параметр socktype.
- close()¶
Закрывает сокет, подключённый к удалённому узлу.
- emit(record)¶
Запись форматируется и отправляется на сервер syslog. Если присутствует информация об исключении, она не отправляется на сервер.
Изменено в версии 3.2.1: (См.: issue 12168.) В более ранних версиях сообщение, отправляемое демонам syslog, всегда завершалось NUL-байтом, поскольку ранние версии этих демонов ожидали сообщение с завершающим NUL – хотя это не предусмотрено соответствующей спецификацией (RFC 5424). Более новые версии этих демонов не ожидают NUL-байт, но удаляют его, если он присутствует, а ещё более новые демоны (которые точнее следуют RFC 5424) передают NUL-байт как часть сообщения.
Чтобы упростить обработку сообщений syslog в условиях столь разного поведения демонов, добавление NUL-байта было сделано настраиваемым с помощью атрибута уровня класса append_nul. По умолчанию он равен True (сохраняя существующее поведение), но может быть установлен в False на экземпляре SysLogHandler, чтобы этот экземпляр не добавлял завершающий NUL.
Изменено в версии 3.3: (См.: issue 12419.) В более ранних версиях не было возможности указать префикс “ident” или “tag” для идентификации источника сообщения. Теперь его можно задать с помощью атрибута уровня класса, по умолчанию "" для сохранения существующего поведения, но который может быть переопределён на экземпляре SysLogHandler, чтобы этот экземпляр добавлял идентификатор к каждому обработанному сообщению. Обратите внимание, что указанный идентификатор должен быть текстом, не байтами, и добавляется к сообщению как есть.
- encodePriority(facility, priority)¶
Кодирует средство и приоритет в целое число. Можно передавать строки или целые числа – если передаются строки, внутренние словари сопоставлений используются для преобразования их в целые числа.
Символические значения LOG_ определены в SysLogHandler и соответствуют значениям, определённым в заголовочном файле sys/syslog.h.
Приоритеты
Имя (строка) Символическое значение alert LOG_ALERT crit or critical LOG_CRIT debug LOG_DEBUG emerg or panic LOG_EMERG err or error LOG_ERR info LOG_INFO notice LOG_NOTICE warn or warning LOG_WARNING Средства
Имя (строка) Символическое значение auth LOG_AUTH authpriv LOG_AUTHPRIV cron LOG_CRON daemon LOG_DAEMON ftp LOG_FTP kern LOG_KERN lpr LOG_LPR mail LOG_MAIL news LOG_NEWS syslog LOG_SYSLOG user LOG_USER uucp LOG_UUCP local0 LOG_LOCAL0 local1 LOG_LOCAL1 local2 LOG_LOCAL2 local3 LOG_LOCAL3 local4 LOG_LOCAL4 local5 LOG_LOCAL5 local6 LOG_LOCAL6 local7 LOG_LOCAL7
- mapPriority(levelname)¶
Сопоставляет имя уровня логирования с именем приоритета syslog. Возможно, потребуется переопределить это, если используются пользовательские уровни, или если алгоритм по умолчанию не подходит. Алгоритм по умолчанию сопоставляет DEBUG, INFO, WARNING, ERROR и CRITICAL с соответствующими именами syslog, а все остальные уровни сопоставляет с 'warning'.
16.8.11. NTEventLogHandler¶
Класс NTEventLogHandler, расположенный в модуле logging.handlers модуле, поддерживает отправку сообщений логирования в журнал событий локальной системы Windows NT, Windows 2000 или Windows XP. Перед использованием необходимо установить расширения Win32 для Python от Mark Hammond.
- 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.
16.8.12. SMTPHandler¶
Класс SMTPHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений логирования на адрес электронной почты через SMTP.
- class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)¶
Возвращает новый экземпляр класса SMTPHandler. Экземпляр инициализируется адресами отправителя, получателя и темой письма. Параметр toaddrs должен быть списком строк. Для указания нестандартного порта SMTP используется кортеж (host, port) в аргументе mailhost. Если передана строка, используется стандартный порт SMTP. Если SMTP-сервер требует аутентификации, можно указать кортеж (username, password) в аргументе credentials.
Для использования защищенного протокола (TLS) передайте кортеж в аргумент secure. Это будет работать только при наличии учетных данных для аутентификации. Кортеж должен быть либо пустым, либо содержать один элемент – имя файла ключа, либо два элемента – имена файла ключа и сертификата. (Этот кортеж передается методу smtplib.SMTP.starttls().)
Для взаимодействия с SMTP-сервером можно задать тайм-аут с помощью аргумента timeout.
Новое в версии 3.3: Аргумент timeout был добавлен.
- emit(record)¶
Форматирует запись и отправляет её указанным получателям.
- getSubject(record)¶
Чтобы задать тему письма, зависящую от записи, переопределите этот метод.
16.8.13. MemoryHandler¶
Класс 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)¶
Возвращает новый экземпляр класса MemoryHandler. Экземпляр инициализируется с размером буфера capacity. Если flushLevel не указан, используется ERROR. Если target не указан, перед тем как обработчик начнёт работать, цель нужно задать с помощью setTarget().
- flush()¶
Для MemoryHandler сброс означает просто отправку буферизованных записей целевому обработчику, если он есть. Буфер также очищается, когда это происходит. Переопределите, если нужно иное поведение.
- setTarget(target)¶
Устанавливает целевой обработчик для данного обработчика.
- shouldFlush(record)¶
Проверяет, заполнен ли буфер или поступила запись уровня flushLevel или выше.
16.8.14. HTTPHandler¶
Класс HTTPHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений журнала на веб-сервер с использованием семантики GET или POST.
- class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None)¶
Returns a new instance of the HTTPHandler class. The host can be of the form host:port, should you need to use a specific port number. If no method is specified, GET is used. If secure is true, a HTTPS connection will be used. The context parameter may be set to a ssl.SSLContext instance to configure the SSL settings used for the HTTPS connection. If credentials is specified, it should be a 2-tuple consisting of userid and password, which will be placed in a HTTP ‘Authorization’ header using Basic authentication. If you specify credentials, you should also specify secure=True so that your userid and password are not passed in cleartext across the wire.
Изменено в версии 3.4.3: Был добавлен параметр context.
- mapLogRecord(record)¶
Предоставляет словарь на основе record, который будет URL-закодирован и отправлен на веб-сервер. Реализация по умолчанию просто возвращает record.__dict__. Этот метод можно переопределить, если, например, на веб-сервер нужно отправлять только подмножество LogRecord, или требуется более точная настройка того, что отправляется на сервер.
- emit(record)¶
Отправляет запись на веб-сервер в виде URL-закодированного словаря. Метод mapLogRecord() используется для преобразования записи в словарь для отправки.
Примечание
Поскольку подготовка записи для отправки на веб-сервер не является обычной операцией форматирования, использование setFormatter() для указания Formatter для HTTPHandler не имеет эффекта. Вместо вызова format() этот обработчик вызывает mapLogRecord(), а затем urllib.parse.urlencode() для кодирования словаря в форму, пригодную для отправки на веб-сервер.
16.8.15. QueueHandler¶
Новое в версии 3.2.
Класс QueueHandler, расположенный в модуле logging.handlers, поддерживает отправку сообщений журнала в очередь, например, реализованную в модулях queue или multiprocessing.
Вместе с классом QueueListener QueueHandler можно использовать, чтобы обработчики выполняли свою работу в отдельном потоке, отличном от того, который ведёт журналирование. Это важно в веб-приложениях и других служебных приложениях, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, в то время как потенциально медленные операции (например, отправка электронной почты через SMTPHandler) выполняются в отдельном потоке.
- class logging.handlers.QueueHandler(queue)¶
Возвращает новый экземпляр класса QueueHandler. Экземпляр инициализируется очередью для отправки сообщений. Очередью может быть любой объект, похожий на очередь; он используется как есть методом enqueue(), который должен знать, как отправлять в неё сообщения.
- emit(record)¶
Помещает в очередь результат подготовки LogRecord.
- prepare(record)¶
Подготавливает запись для помещения в очередь. Объект, возвращаемый этим методом, помещается в очередь.
Базовая реализация форматирует запись, объединяя сообщение и аргументы, и удаляет несериализуемые элементы из записи на месте.
Этот метод можно переопределить, если требуется преобразовать запись в словарь или JSON-строку, или отправить изменённую копию записи, оставив оригинал нетронутым.
- enqueue(record)¶
Помещает запись в очередь с помощью put_nowait(); этот метод можно переопределить, если требуется блокирующее поведение, или тайм-аут, или собственная реализация очереди.
16.8.16. QueueListener¶
Новое в версии 3.2.
Класс QueueListener, расположенный в модуле logging.handlers , поддерживает получение сообщений журнала из очереди, например, реализованной в модулях queue или multiprocessing. Сообщения получаются из очереди во внутреннем потоке и передаются, в том же потоке, одному или нескольким обработчикам для обработки. Хотя QueueListener сам по себе не является обработчиком, он документирован здесь, поскольку работает в тесной связке с QueueHandler.
Вместе с классом QueueHandler QueueListener можно использовать, чтобы обработчики выполняли свою работу в отдельном потоке, отличном от того, который ведёт журналирование. Это важно в веб-приложениях и других служебных приложениях, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, в то время как потенциально медленные операции (например, отправка электронной почты через SMTPHandler) выполняются в отдельном потоке.
- class logging.handlers.QueueListener(queue, *handlers)¶
Возвращает новый экземпляр класса QueueListener. Экземпляр инициализируется очередью для отправки сообщений и списком обработчиков, которые будут обрабатывать записи, помещенные в очередь. Очередью может быть любой объект, похожий на очередь; он передается как есть методу dequeue(), который должен знать, как получать из неё сообщения.
- dequeue(block)¶
Извлекает запись из очереди и возвращает её, опционально блокируя.
Базовая реализация использует get(). Возможно, потребуется переопределить этот метод, если нужно использовать тайм-ауты или работать с нестандартными реализациями очередей.
- prepare(record)¶
Подготавливает запись к обработке.
Эта реализация просто возвращает переданную запись. Можно переопределить этот метод, если требуется выполнить какую-либо собственную маршалинг или манипуляцию записью перед передачей обработчикам.
- handle(record)¶
Обрабатывает запись.
Этот метод просто перебирает обработчики, предлагая им запись для обработки. Объект, фактически передаваемый обработчикам, – это тот, который возвращается из prepare().
- start()¶
Запускает прослушиватель.
Запускает фоновый поток для отслеживания очереди на предмет LogRecords, которые нужно обработать.
- stop()¶
Останавливает прослушиватель.
Запрашивает завершение потока и затем ожидает его завершения. Обратите внимание: если не вызвать этот метод до завершения приложения, в очереди могут остаться некоторые записи, которые не будут обработаны.
- enqueue_sentinel()¶
Записывает сторожевой элемент в очередь, чтобы сообщить слушателю о завершении. В данной реализации используется put_nowait(). Возможно, потребуется переопределить этот метод, если нужно использовать тайм-ауты или работать с нестандартными реализациями очередей.
Новое в версии 3.3.
См. также
- Модуль logging
- Справочник API для модуля logging.
- Модуль logging.config
- API конфигурации для модуля logging.