logging.handlers.md
1> **Источник:** https://python-all.ru/3.2/library/logging.handlers.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 15.9. [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers) – Обработчики логирования89Важно1011На этой странице представлена только справочная информация. Учебные руководства см. в1213- [*Базовое руководство*](https://python-all.ru/3.2/howto/logging.html#logging-basic-tutorial)14- [*Продвинутое руководство*](https://python-all.ru/3.2/howto/logging.html#logging-advanced-tutorial)15- [*Поваренная книга по логированию*](https://python-all.ru/3.2/howto/logging-cookbook.html#logging-cookbook)1617В пакете предоставлены следующие полезные обработчики. Обратите внимание, что три из них ([`StreamHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.StreamHandler), [`FileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.FileHandler) и [`NullHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.NullHandler)) на самом деле определены в самом модуле [`logging`](https://python-all.ru/3.2/library/logging.html#module-logging), но описаны здесь вместе с остальными обработчиками.1819## 15.9.1. StreamHandler2021Класс [`StreamHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.StreamHandler), расположенный в основном пакете [`logging`](https://python-all.ru/3.2/library/logging.html#module-logging), отправляет вывод логирования в такие потоки, как *sys.stdout*, *sys.stderr* или любой файлоподобный объект (или, точнее, любой объект, поддерживающий методы `write()` и `flush()`).2223#### `class logging.StreamHandler(stream=None)`2425Возвращает новый экземпляр класса [`StreamHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.StreamHandler). Если указан параметр *поток данных*, экземпляр использует его для вывода логирования; в противном случае используется *sys.stderr*.2627#### `emit(record)`2829Если указан форматтер, он форматирует запись. Затем запись записывается в поток с завершающим символом. Если присутствует информация об исключении, она форматируется с помощью [`traceback.print_exception()`](https://python-all.ru/3.2/library/traceback.html#traceback.print_exception) и добавляется в поток.3031#### `flush()`3233Сбрасывает поток данных, вызывая его метод [`flush()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.StreamHandler.flush). Обратите внимание, что метод `close()` наследуется от `Handler` и поэтому не выводит ничего, так что иногда может потребоваться явный вызов [`flush()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.StreamHandler.flush).3435Изменено в версии 3.2: Класс `StreamHandler` теперь имеет атрибут `terminator`, значением по умолчанию которого является `'\n'`. Этот атрибут используется в качестве завершающего символа при записи форматированной записи в поток. Если вы не хотите такого завершения переводом строки, можно установить атрибут `terminator` экземпляра обработчика в пустую строку. В более ранних версиях завершитель был жёстко задан как `'\n'`.3637## 15.9.2. FileHandler3839Класс [`FileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.FileHandler), расположенный в основном пакете [`logging`](https://python-all.ru/3.2/library/logging.html#module-logging), отправляет вывод логирования в файл на диске. Он наследует функциональность вывода от [`StreamHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.StreamHandler).4041#### `class logging.FileHandler(filename, mode='a', encoding=None, delay=False)`4243Возвращает новый экземпляр класса [`FileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.FileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен *None*, файл открывается с указанной кодировкой. Если *delay* равен true, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.FileHandler.emit). По умолчанию файл растёт бесконечно.4445#### `close()`4647Закрывает файл.4849#### `emit(record)`5051Выводит запись в файл.5253## 15.9.3. NullHandler5455Новое в версии 3.1.5657Класс [`NullHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.NullHandler), расположенный в основном пакете [`logging`](https://python-all.ru/3.2/library/logging.html#module-logging), не выполняет никакого форматирования или вывода. По сути это обработчик-пустышка, предназначенный для разработчиков библиотек.5859#### `class logging.NullHandler`6061Возвращает новый экземпляр класса [`NullHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.NullHandler).6263#### `emit(record)`6465Этот метод ничего не делает.6667#### `handle(record)`6869Этот метод ничего не делает.7071#### `createLock()`7273Этот метод возвращает `None` для блокировки, поскольку нет базового ввода-вывода, доступ к которому необходимо синхронизировать.7475Смотрите [*Настройка логирования для библиотеки*](https://python-all.ru/3.2/howto/logging.html#library-config) для получения дополнительной информации об использовании [`NullHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.NullHandler).7677## 15.9.4. WatchedFileHandler7879The [`WatchedFileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.WatchedFileHandler) class, located in the [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-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.8081Файл может измениться из-за использования таких программ, как *newsyslog* и *logrotate*, которые выполняют ротацию файлов журнала. Этот обработчик, предназначенный для использования в Unix/Linux, следит, не изменился ли файл с момента последнего вызова emit. (Считается, что файл изменился, если изменились его устройство или inode.) Если файл изменился, старый поток файла закрывается, а файл открывается для получения нового потока.8283Этот обработчик не подходит для использования в Windows, потому что в Windows открытые файлы журналов нельзя перемещать или переименовывать – логирование открывает файлы с эксклюзивными блокировками – поэтому такой обработчик не нужен. Кроме того, *ST\_INO* не поддерживается в Windows; [`stat()`](https://python-all.ru/3.2/library/stat.html#module-stat) всегда возвращает ноль для этого значения.8485#### `class logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]])`8687Возвращает новый экземпляр класса [`WatchedFileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.WatchedFileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен *None*, файл открывается с указанной кодировкой. Если *delay* равен true, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.WatchedFileHandler.emit). По умолчанию файл растёт бесконечно.8889#### `emit(record)`9091Выводит запись в файл, но сначала проверяет, изменился ли файл. Если изменился, существующий поток сбрасывается и закрывается, а файл открывается заново, после чего запись выводится в файл.9293## 15.9.5. RotatingFileHandler9495Класс [`RotatingFileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.RotatingFileHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает ротацию файлов журнала на диске.9697#### `class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)`9899Возвращает новый экземпляр класса [`RotatingFileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.RotatingFileHandler). Указанный файл открывается и используется как поток для журналирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен *None*, файл открывается с указанной кодировкой. Если *delay* равен истине, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.RotatingFileHandler.emit). По умолчанию файл растёт бесконечно.100101Значения *maxBytes* и *backupCount* позволяют задать размер, при котором файл *переключается*. Когда размер почти превышен, файл закрывается и новый файл открывается для записи. Переключение происходит, когда текущий файл журнала приближается к длине *maxBytes*; если *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` и т.д. соответственно.102103#### `doRollover()`104105Выполняет ротацию, как описано выше.106107#### `emit(record)`108109Записывает запись (record) в файл, выполняя при необходимости ротацию, как описано ранее.110111## 15.9.6. TimedRotatingFileHandler112113Класс [`TimedRotatingFileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает ротацию файлов журнала на диске через заданные интервалы времени.114115#### `class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)`116117Возвращает новый экземпляр класса [`TimedRotatingFileHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler). Указанный файл открывается и используется как поток для журналирования. При ротации также устанавливается суффикс имени файла. Ротация происходит на основе произведения *when* и *interval*.118119Параметр *when* указывает тип *interval*. Список возможных значений приведён ниже. Обратите внимание, что регистр не учитывается.120121| Значение | Тип интервала |122| --- | --- |123| `'S'` | Секунды |124| `'M'` | Минуты |125| `'H'` | Часы |126| `'D'` | Дни |127| `'W0'-'W6'` | День недели (0=понедельник) |128| `'midnight'` | Переключение в полночь |129130При использовании ротации по дням недели укажите 'W0' для понедельника, 'W1' для вторника и так далее до 'W6' для воскресенья. В этом случае значение, переданное для *interval*, не используется.131132Система будет сохранять старые файлы журнала, добавляя расширения к имени файла. Расширения основаны на дате и времени, с использованием формата strftime `%Y-%m-%d_%H-%M-%S` или его начальной части, в зависимости от интервала ротации.133134При первом вычислении времени следующей ротации (при создании обработчика) используется время последнего изменения существующего файла журнала или, в противном случае, текущее время, чтобы определить, когда произойдёт следующая ротация.135136Если аргумент *utc* равен true, используется время в UTC; в противном случае используется местное время.137138Если *backupCount* не равен нулю, сохраняется не более *backupCount* файлов; если при ротации должно быть создано больше файлов, самый старый удаляется. Логика удаления использует интервал для определения того, какие файлы нужно удалить, поэтому изменение интервала может привести к тому, что старые файлы останутся.139140Если *delay* равен true, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler.emit).141142#### `doRollover()`143144Выполняет ротацию, как описано выше.145146#### `emit(record)`147148Выводит запись в файл, обеспечивая ротацию, как описано выше.149150## 15.9.7. SocketHandler151152Класс [`SocketHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SocketHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), отправляет вывод журнала в сетевой сокет. Базовый класс использует TCP-сокет.153154#### `class logging.handlers.SocketHandler(host, port)`155156Возвращает новый экземпляр класса [`SocketHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SocketHandler), предназначенного для взаимодействия с удаленной машиной, адрес которой задается *host* и *port*.157158#### `close()`159160Закрывает сокет.161162#### `emit()`163164Сериализует словарь атрибутов записи и записывает его в сокет в бинарном формате. Если при работе с сокетом возникает ошибка, пакет молча отбрасывается. Если соединение было ранее потеряно, оно восстанавливается. Для десериализации записи на принимающей стороне в `LogRecord` используйте функцию `makeLogRecord()`.165166#### `handleError()`167168Обрабатывает ошибку, возникшую во время [`emit()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SocketHandler.emit). Наиболее вероятная причина – потеря соединения. Закрывает сокет, чтобы можно было повторить попытку при следующем событии.169170#### `makeSocket()`171172Это фабричный метод, позволяющий подклассам определять точный тип сокета, который они хотят. Реализация по умолчанию создает TCP-сокет ([`socket.SOCK_STREAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_STREAM)).173174#### `makePickle(record)`175176Сериализует словарь атрибутов записи в двоичном формате с префиксом длины и возвращает его готовым к передаче через сокет.177178Обратите внимание, что модуль pickle не является полностью безопасным. Если вас беспокоит безопасность, вы можете переопределить этот метод, чтобы реализовать более надёжный механизм. Например, можно подписывать данные с помощью HMAC и проверять подпись на принимающей стороне, либо отключить десериализацию глобальных объектов на принимающей стороне.179180#### `send(packet)`181182Отправляет сериализованную с помощью pickle строку *packet* в сокет. Эта функция допускает частичную отправку, которая может произойти, когда сеть занята.183184#### `createSocket()`185186Пытается создать сокет; в случае неудачи использует алгоритм экспоненциальной задержки. При первоначальном сбое обработчик отбрасывает сообщение, которое пытался отправить. Когда последующие сообщения обрабатываются тем же экземпляром, он не будет пытаться подключиться, пока не пройдет некоторое время. Параметры по умолчанию таковы, что начальная задержка составляет одну секунду, и если после этой задержки соединение всё ещё не может быть установлено, обработчик будет каждый раз удваивать задержку вплоть до максимума в 30 секунд.187188Это поведение управляется следующими атрибутами обработчика:189190- `retryStart` (начальная задержка, по умолчанию 1.0 секунды).191- `retryFactor` (множитель, по умолчанию 2.0).192- `retryMax` (максимальная задержка, по умолчанию 30.0 секунд).193194Это означает, что если удалённый слушатель запускается *после* того, как обработчик уже использовался, возможна потеря сообщений (поскольку обработчик даже не будет пытаться установить соединение, пока не истечёт задержка, а будет просто молча отбрасывать сообщения в течение этого периода).195196## 15.9.8. DatagramHandler197198Класс [`DatagramHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.DatagramHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), наследует от [`SocketHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SocketHandler) для поддержки отправки сообщений журнала через UDP-сокеты.199200#### `class logging.handlers.DatagramHandler(host, port)`201202Возвращает новый экземпляр класса [`DatagramHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.DatagramHandler), предназначенного для взаимодействия с удаленной машиной, адрес которой задается *host* и *port*.203204#### `emit()`205206Сериализует словарь атрибутов записи и записывает его в сокет в бинарном формате. Если при работе с сокетом возникает ошибка, пакет молча отбрасывается. Для десериализации записи на принимающей стороне в `LogRecord` используйте функцию `makeLogRecord()`.207208#### `makeSocket()`209210Фабричный метод [`SocketHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SocketHandler) здесь переопределен для создания UDP-сокета ([`socket.SOCK_DGRAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_DGRAM)).211212#### `send(s)`213214Отправляет сериализованную с помощью pickle строку в сокет.215216## 15.9.9. SysLogHandler217218Класс [`SysLogHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SysLogHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала на удалённый или локальный syslog Unix.219220#### `class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)`221222Возвращает новый экземпляр класса [`SysLogHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SysLogHandler), предназначенного для взаимодействия с удалённой Unix-машиной, чей адрес задаётся *address* в виде кортежа `(host, port)`. Если *address* не указан, используется `('localhost', 514)`. Адрес используется для открытия сокета. Альтернативой предоставлению кортежа `(host, port)` является передача адреса в виде строки, например ‘/dev/log’. В этом случае для отправки сообщения syslog используется сокет домена Unix. Если *facility* не указан, используется `LOG_USER`. Тип открываемого сокета зависит от аргумента *socktype*, который по умолчанию равен [`socket.SOCK_DGRAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_DGRAM) и, таким образом, открывает UDP-сокет. Чтобы открыть TCP-сокет (для использования с более новыми демонами syslog, такими как rsyslog), укажите значение [`socket.SOCK_STREAM`](https://python-all.ru/3.2/library/socket.html#socket.SOCK_STREAM).223224Обратите внимание: если ваш сервер не слушает UDP-порт 514, [`SysLogHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SysLogHandler) может не работать. В этом случае проверьте, какой адрес следует использовать для сокета домена – это зависит от системы. Например, в Linux это обычно ‘/dev/log’, а в OS/X – ‘/var/run/syslog’. Вам нужно проверить свою платформу и использовать соответствующий адрес (возможно, придётся делать эту проверку во время выполнения, если приложение должно работать на нескольких платформах). В Windows практически приходится использовать опцию UDP.225226Изменено в версии 3.2: *socktype* был добавлен.227228#### `close()`229230Закрывает сокет, подключённый к удалённому узлу.231232#### `emit(record)`233234Запись форматируется и отправляется на сервер syslog. Если присутствует информация об исключении, она *не* отправляется на сервер.235236Изменено в версии 3.2.1: (См.: [issue 12168](https://python-all.ru/3.2/library/logging.handlers.html).) В более ранних версиях сообщение, отправляемое демонам syslog, всегда завершалось нулевым байтом, поскольку ранние версии этих демонов ожидали сообщение с нулевым завершителем – хотя это и не соответствует соответствующей спецификации (RF 5424). Более новые версии этих демонов не ожидают нулевого байта, но удаляют его, если он есть, а ещё более новые демоны (которые строже следуют RFC 5424) передают нулевой байт как часть сообщения.237238Чтобы упростить обработку сообщений syslog в условиях столь разного поведения демонов, добавление NUL-байта было сделано настраиваемым с помощью атрибута уровня класса `append_nul`. По умолчанию он равен `True` (сохраняя существующее поведение), но может быть установлен в `False` на экземпляре `SysLogHandler`, чтобы этот экземпляр *не* добавлял завершающий NUL.239240#### `encodePriority(facility, priority)`241242Кодирует средство и приоритет в целое число. Можно передавать строки или целые числа – если передаются строки, внутренние словари сопоставлений используются для преобразования их в целые числа.243244Символические значения `LOG_` определены в [`SysLogHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SysLogHandler) и соответствуют значениям, определённым в заголовочном файле `sys/syslog.h`.245246**Приоритеты**247248| Имя (строка) | Символическое значение |249| --- | --- |250| `alert` | LOG\_ALERT |251| `crit` или `critical` | LOG\_CRIT |252| `отладка` | LOG\_DEBUG |253| `аварийная` или `паника` | LOG\_EMERG |254| `ошибка` или `ошибка` | LOG\_ERR |255| `информация` | LOG\_INFO |256| `уведомление` | LOG\_NOTICE |257| `предупреждение` или `предупреждение` | LOG\_WARNING |258259**Средства**260261| Имя (строка) | Символическое значение |262| --- | --- |263| `аутентификация` | LOG\_AUTH |264| `authpriv` | LOG\_AUTHPRIV |265| `cron` | LOG\_CRON |266| `демон` | LOG\_DAEMON |267| `ftp` | LOG\_FTP |268| `ядро` | LOG\_KERN |269| `lpr` | LOG\_LPR |270| `почта` | LOG\_MAIL |271| `новости` | LOG\_NEWS |272| `syslog` | LOG\_SYSLOG |273| `user` | LOG\_USER |274| `uucp` | LOG\_UUCP |275| `local0` | LOG\_LOCAL0 |276| `local1` | LOG\_LOCAL1 |277| `local2` | LOG\_LOCAL2 |278| `local3` | LOG\_LOCAL3 |279| `local4` | LOG\_LOCAL4 |280| `local5` | LOG\_LOCAL5 |281| `local6` | LOG\_LOCAL6 |282| `local7` | LOG\_LOCAL7 |283284#### `mapPriority(levelname)`285286Сопоставляет имя уровня логирования с именем приоритета syslog. Возможно, потребуется переопределить это, если используются пользовательские уровни, или если алгоритм по умолчанию не подходит. Алгоритм по умолчанию сопоставляет `DEBUG`, `INFO`, `WARNING`, `ERROR` и `CRITICAL` с соответствующими именами syslog, а все остальные уровни сопоставляет с 'warning'.287288## 15.9.10. NTEventLogHandler289290Класс [`NTEventLogHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.NTEventLogHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers) модуле, поддерживает отправку сообщений логирования в журнал событий локальной системы Windows NT, Windows 2000 или Windows XP. Перед использованием необходимо установить расширения Win32 для Python от Mark Hammond.291292#### `class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')`293294Возвращает новый экземпляр класса [`NTEventLogHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.NTEventLogHandler). Параметр *appname* используется для определения имени приложения, отображаемого в журнале событий. С использованием этого имени создается соответствующая запись реестра. Параметр *dllname* должен содержать полный путь к .dll или .exe-файлу с определениями сообщений для хранения в журнале (если не указан, используется `'win32service.pyd'` – он устанавливается вместе с расширениями Win32 и содержит несколько базовых определений сообщений-заполнителей. Обратите внимание, что использование этих заполнителей приведет к увеличению размера журнала, так как весь источник сообщений хранится в журнале. Если нужны более компактные журналы, следует передать имя собственного .dll или .exe, содержащего нужные определения сообщений). Параметр *logtype* может быть одним из `'Application'`, `'System'` или `'Security'`, по умолчанию `'Application'`.295296#### `close()`297298На этом этапе можно удалить имя приложения из реестра как источник записей журнала событий. Однако после этого события не будут отображаться в средстве просмотра журнала событий так, как предполагалось – для получения имени .dll требуется доступ к реестру. Текущая версия этого не делает.299300#### `emit(record)`301302Определяет идентификатор сообщения, категорию и тип события, а затем записывает сообщение в журнал событий NT.303304#### `getEventCategory(record)`305306Возвращает категорию события для записи. Переопределите этот метод, чтобы указать собственные категории. Данная версия возвращает 0.307308#### `getEventType(record)`309310Возвращает тип события для записи. Переопределите этот метод, если нужно задать собственные типы. В данной версии используется сопоставление через атрибут typemap обработчика, который устанавливается в [`__init__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__init__) в виде словаря, содержащего сопоставления для `DEBUG`, `INFO`, `WARNING`, `ERROR` и `CRITICAL`. При использовании собственных уровней потребуется либо переопределить этот метод, либо поместить подходящий словарь в атрибут *typemap* обработчика.311312#### `getMessageID(record)`313314Возвращает идентификатор сообщения для записи. При использовании собственных сообщений можно передать в логгер идентификатор *msg* вместо строки форматирования. Затем здесь можно выполнить поиск по словарю для получения идентификатора сообщения. Данная версия возвращает 1 – базовый идентификатор сообщения в `win32service.pyd`.315316## 15.9.11. SMTPHandler317318Класс [`SMTPHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SMTPHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений логирования на адрес электронной почты через SMTP.319320#### `class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None)`321322Возвращает новый экземпляр класса [`SMTPHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SMTPHandler). Экземпляр инициализируется адресами отправителя, получателя и темой письма. Параметр *toaddrs* должен быть списком строк. Для указания нестандартного порта SMTP используется кортеж (host, port) в аргументе *mailhost*. Если передана строка, используется стандартный порт SMTP. Если SMTP-сервер требует аутентификации, можно указать кортеж (username, password) в аргументе *credentials*.323324Для использования защищенного протокола (TLS) передайте кортеж в аргумент *secure*. Это будет работать только при наличии учетных данных для аутентификации. Кортеж должен быть либо пустым, либо содержать один элемент – имя файла ключа, либо два элемента – имена файла ключа и сертификата. (Этот кортеж передается методу [`smtplib.SMTP.starttls()`](https://python-all.ru/3.2/library/smtplib.html#smtplib.SMTP.starttls).)325326#### `emit(record)`327328Форматирует запись и отправляет её указанным получателям.329330#### `getSubject(record)`331332Чтобы задать тему письма, зависящую от записи, переопределите этот метод.333334## 15.9.12. MemoryHandler335336Класс [`MemoryHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.MemoryHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает буферизацию записей логирования в памяти с периодической отправкой в целевой обработчик *target*. Сброс происходит, когда буфер заполнен или когда встречается событие определенного уровня серьезности или выше.337338[`MemoryHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.MemoryHandler) является подклассом более общего [`BufferingHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.BufferingHandler), который является абстрактным классом. Он буферизует записи логирования в памяти. При добавлении каждой записи в буфер вызывается `shouldFlush()` для проверки необходимости сброса. Если сброс требуется, то ожидается, что `flush()` выполнит сброс.339340#### `class logging.handlers.BufferingHandler(capacity)`341342Инициализирует обработчик буфером указанной ёмкости.343344#### `emit(record)`345346Добавляет запись в буфер. Если [`shouldFlush()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.BufferingHandler.shouldFlush) возвращает true, вызывает [`flush()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.BufferingHandler.flush) для обработки буфера.347348#### `flush()`349350Вы можете переопределить этот метод, чтобы задать собственное поведение при сбросе. Текущая версия просто очищает буфер.351352#### `shouldFlush(record)`353354Возвращает true, если буфер заполнен до ёмкости. Этот метод можно переопределить для реализации собственных стратегий сброса.355356#### `class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None)`357358Возвращает новый экземпляр класса [`MemoryHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.MemoryHandler). Экземпляр инициализируется с размером буфера *capacity*. Если *flushLevel* не указан, используется `ERROR`. Если *target* не указан, перед тем как обработчик начнёт работать, цель нужно задать с помощью [`setTarget()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.MemoryHandler.setTarget).359360#### `close()`361362Вызывает [`flush()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.MemoryHandler.flush), устанавливает цель в [`None`](https://python-all.ru/3.2/library/constants.html#None) и очищает буфер.363364#### `flush()`365366Для [`MemoryHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.MemoryHandler) сброс означает просто отправку буферизованных записей целевому обработчику, если он есть. Буфер также очищается, когда это происходит. Переопределите, если нужно иное поведение.367368#### `setTarget(target)`369370Устанавливает целевой обработчик для данного обработчика.371372#### `shouldFlush(record)`373374Проверяет, заполнен ли буфер или поступила запись уровня *flushLevel* или выше.375376## 15.9.13. HTTPHandler377378Класс [`HTTPHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.HTTPHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала на веб-сервер с использованием семантики `GET` или `POST`.379380#### `class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None)`381382Возвращает новый экземпляр класса [`HTTPHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.HTTPHandler). Параметр *host* может быть задан в формате `host:port`, если нужно указать конкретный номер порта. Если *method* не указан, используется `GET`. Если *secure* равно True, будет использоваться HTTPS- соединение. Если указан *credentials*, это должен быть кортеж из двух элементов: идентификатора пользователя и пароля. Они помещаются в HTTP- заголовок ‘Authorization’ с использованием базовой аутентификации. При указании credentials также следует установить secure=True, чтобы идентификатор пользователя и пароль не передавались по сети в открытом виде.383384#### `emit(record)`385386Отправляет запись на веб-сервер в виде словаря в процентной кодировке.387388## 15.9.14. QueueHandler389390Новое в версии 3.2.391392Класс [`QueueHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала в очередь, например, реализованную в модулях [`queue`](https://python-all.ru/3.2/library/queue.html#module-queue) или [`multiprocessing`](https://python-all.ru/3.2/library/multiprocessing.html#module-multiprocessing).393394Вместе с классом [`QueueListener`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener) [`QueueHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueHandler) можно использовать, чтобы обработчики выполняли свою работу в отдельном потоке, отличном от того, который ведёт журналирование. Это важно в веб-приложениях и других служебных приложениях, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, в то время как потенциально медленные операции (например, отправка электронной почты через [`SMTPHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SMTPHandler)) выполняются в отдельном потоке.395396#### `class logging.handlers.QueueHandler(queue)`397398Возвращает новый экземпляр класса [`QueueHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueHandler). Экземпляр инициализируется очередью для отправки сообщений. Очередью может быть любой объект, похожий на очередь; он используется как есть методом [`enqueue()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueHandler.enqueue), который должен знать, как отправлять в неё сообщения.399400#### `emit(record)`401402Помещает в очередь результат подготовки LogRecord.403404#### `prepare(record)`405406Подготавливает запись для помещения в очередь. Объект, возвращаемый этим методом, помещается в очередь.407408Базовая реализация форматирует запись, объединяя сообщение и аргументы, и удаляет несериализуемые элементы из записи на месте.409410Этот метод можно переопределить, если требуется преобразовать запись в словарь или JSON-строку, или отправить изменённую копию записи, оставив оригинал нетронутым.411412#### `enqueue(record)`413414Помещает запись в очередь с помощью `put_nowait()`; возможно, потребуется переопределить этот метод, если нужно использовать блокирующее поведение, тайм-аут или нестандартную реализацию очереди.415416## 15.9.15. QueueListener417418Новое в версии 3.2.419420Класс [`QueueListener`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.2/library/logging.handlers.html#module-logging.handlers) , поддерживает получение сообщений журнала из очереди, например, реализованной в модулях [`queue`](https://python-all.ru/3.2/library/queue.html#module-queue) или [`multiprocessing`](https://python-all.ru/3.2/library/multiprocessing.html#module-multiprocessing). Сообщения получаются из очереди во внутреннем потоке и передаются, в том же потоке, одному или нескольким обработчикам для обработки. Хотя [`QueueListener`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener) сам по себе не является обработчиком, он документирован здесь, поскольку работает в тесной связке с [`QueueHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueHandler).421422Вместе с классом [`QueueHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueHandler) [`QueueListener`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener) можно использовать, чтобы обработчики выполняли свою работу в отдельном потоке, отличном от того, который ведёт журналирование. Это важно в веб-приложениях и других служебных приложениях, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, в то время как потенциально медленные операции (например, отправка электронной почты через [`SMTPHandler`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.SMTPHandler)) выполняются в отдельном потоке.423424#### `class logging.handlers.QueueListener(queue, *handlers)`425426Возвращает новый экземпляр класса [`QueueListener`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener). Экземпляр инициализируется очередью для отправки сообщений и списком обработчиков, которые будут обрабатывать записи, помещенные в очередь. Очередью может быть любой объект, похожий на очередь; он передается как есть методу [`dequeue()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener.dequeue), который должен знать, как получать из неё сообщения.427428#### `dequeue(block)`429430Извлекает запись из очереди и возвращает её, опционально блокируя.431432Базовая реализация использует `get()`. Возможно, потребуется переопределить этот метод, если нужно использовать тайм-ауты или работать с нестандартными реализациями очередей.433434#### `prepare(record)`435436Подготавливает запись к обработке.437438Эта реализация просто возвращает переданную запись. Можно переопределить этот метод, если требуется выполнить какую-либо собственную маршалинг или манипуляцию записью перед передачей обработчикам.439440#### `handle(record)`441442Обрабатывает запись.443444Этот метод просто перебирает обработчики, предлагая им запись для обработки. Объект, фактически передаваемый обработчикам, – это тот, который возвращается из [`prepare()`](https://python-all.ru/3.2/library/logging.handlers.html#logging.handlers.QueueListener.prepare).445446#### `start()`447448Запускает прослушиватель.449450Запускает фоновый поток для отслеживания очереди на предмет LogRecords, которые нужно обработать.451452#### `stop()`453454Останавливает прослушиватель.455456Запрашивает завершение потока и затем ожидает его завершения. Обратите внимание: если не вызвать этот метод до завершения приложения, в очереди могут остаться некоторые записи, которые не будут обработаны.457458> **См. также**459>460> **Модуль [`logging`](https://python-all.ru/3.2/library/logging.html#module-logging)**461>462> Справочник API для модуля logging.463>464> **Модуль [`logging.config`](https://python-all.ru/3.2/library/logging.config.html#module-logging.config)**465>466> API конфигурации для модуля logging.467