Документация Python неофициальный перевод

logging.handlers.md

415 строк · 44.9 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/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/2.7/library/logging.handlers.html#module-logging.handlers) – Обработчики журналирования89Важно1011На этой странице представлена только справочная информация. Учебные руководства см. в1213- [Базовое руководство](https://python-all.ru/2.7/howto/logging.html#logging-basic-tutorial)14- [Продвинутое руководство](https://python-all.ru/2.7/howto/logging.html#logging-advanced-tutorial)15- [Поваренная книга по логированию](https://python-all.ru/2.7/howto/logging-cookbook.html#logging-cookbook)1617**Исходный код:** [Lib/logging/handlers.py](https://python-all.ru/src/2.7/Lib/logging/handlers.py)1819---2021В пакете представлены следующие полезные обработчики. Обратите внимание, что три из них ([`StreamHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.StreamHandler), [`FileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.FileHandler) и [`NullHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.NullHandler)) на самом деле определены в самом модуле [`logging`](https://python-all.ru/2.7/library/logging.html#module-logging), но документированы здесь вместе с остальными обработчиками.2223## 15.9.1. StreamHandler2425Класс [`StreamHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.StreamHandler), находящийся в основном пакете [`logging`](https://python-all.ru/2.7/library/logging.html#module-logging), отправляет вывод логирования в потоки данных, такие как *sys.stdout*, *sys.stderr* или любой объект, похожий на файл (или, точнее, любой объект, который поддерживает методы `write()` и `flush()`).2627#### `class logging.StreamHandler(stream=None)`2829Возвращает новый экземпляр класса [`StreamHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.StreamHandler). Если указан *stream*, экземпляр будет использовать его для вывода логирования; в противном случае будет использоваться *sys.stderr*.3031#### `emit(record)`3233Если указан форматер, он используется для форматирования записи. Запись затем выводится в поток с завершающим символом новой строки. Если присутствует информация об исключении, она форматируется с помощью [`traceback.print_exception()`](https://python-all.ru/2.7/library/traceback.html#traceback.print_exception) и добавляется в поток.3435#### `flush()`3637Сбрасывает поток данных вызовом его метода [`flush()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.StreamHandler.flush). Обратите внимание, что метод `close()` наследуется от `Handler` и поэтому не производит вывода, так что иногда может потребоваться явный вызов [`flush()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.StreamHandler.flush).3839## 15.9.2. FileHandler4041Класс [`FileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.FileHandler), находящийся в основном пакете [`logging`](https://python-all.ru/2.7/library/logging.html#module-logging), направляет вывод журнала в файл на диске. Он наследует функциональность вывода от [`StreamHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.StreamHandler).4243#### `class logging.FileHandler(filename, mode='a', encoding=None, delay=False)`4445Возвращает новый экземпляр класса [`FileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.FileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен `None`, он используется для открытия файла с указанной кодировкой. Если *delay* истинно, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.FileHandler.emit). По умолчанию файл растёт бесконечно.4647Изменено в версии 2.6: *delay* добавлен.4849#### `close()`5051Закрывает файл.5253#### `emit(record)`5455Выводит запись в файл.5657## 15.9.3. NullHandler5859Новое в версии 2.7.6061Класс [`NullHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.NullHandler), находящийся в основном пакете [`logging`](https://python-all.ru/2.7/library/logging.html#module-logging), не выполняет никакого форматирования или вывода. По сути это обработчик-пустышка (‘no-op’), предназначенный для разработчиков библиотек.6263#### `class logging.NullHandler`6465Возвращает новый экземпляр класса [`NullHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.NullHandler).6667#### `emit(record)`6869Этот метод ничего не делает.7071#### `handle(record)`7273Этот метод ничего не делает.7475#### `createLock()`7677Этот метод возвращает `None` для блокировки, так как нет базового ввода-вывода, доступ к которому нужно сериализовать.7879См. [Настройка журналирования для библиотеки](https://python-all.ru/2.7/howto/logging.html#library-config) для получения дополнительной информации об использовании [`NullHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.NullHandler).8081## 15.9.4. WatchedFileHandler8283Новое в версии 2.6.8485Класс [`WatchedFileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.WatchedFileHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), представляет собой `FileHandler`, который отслеживает файл, в который ведётся журналирование. Если файл изменяется, он закрывается и снова открывается по тому же имени.8687Файл может измениться из-за использования таких программ, как *newsyslog* и *logrotate*, которые выполняют ротацию файлов журнала. Этот обработчик, предназначенный для использования в Unix/Linux, следит, не изменился ли файл с момента последнего вызова emit. (Считается, что файл изменился, если изменились его устройство или inode.) Если файл изменился, старый поток файла закрывается, а файл открывается для получения нового потока.8889Этот обработчик не подходит для использования в Windows, потому что в Windows открытые файлы журнала нельзя перемещать или переименовывать – журналирование открывает файлы с эксклюзивными блокировками, – поэтому такой обработчик не нужен. Кроме того, *ST\_INO* не поддерживается в Windows; [`stat()`](https://python-all.ru/2.7/library/os.html#os.stat) всегда возвращает ноль для этого значения.9091#### `class logging.handlers.WatchedFileHandler(filename[, mode[, encoding[, delay]]])`9293Возвращает новый экземпляр класса [`WatchedFileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.WatchedFileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен `None`, он используется для открытия файла с указанной кодировкой. Если *delay* истинно, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.WatchedFileHandler.emit). По умолчанию файл растёт бесконечно.9495#### `emit(record)`9697Выводит запись в файл, но сначала проверяет, изменился ли файл. Если изменился, существующий поток сбрасывается и закрывается, а файл открывается заново, после чего запись выводится в файл.9899## 15.9.5. RotatingFileHandler100101Класс [`RotatingFileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.RotatingFileHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает ротацию файлов журнала на диске.102103#### `class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0)`104105Возвращает новый экземпляр класса [`RotatingFileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.RotatingFileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен `None`, он используется для открытия файла с указанной кодировкой. Если *delay* истинно, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.RotatingFileHandler.emit). По умолчанию файл растёт бесконечно.106107Можно использовать значения *maxBytes* и *backupCount*, чтобы файл мог выполнить *переключение* по достижении заданного размера. Когда размер вот-вот будет превышен, файл закрывается, и новый файл молча открывается для вывода. Переключение происходит всякий раз, когда текущий файл журнала достигает длины, близкой к *maxBytes*; если любое из *maxBytes* или *backupCount* равно нулю, переключение никогда не происходит. Если *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` и т. д. соответственно.108109Изменено в версии 2.6: *delay* добавлен.110111#### `doRollover()`112113Выполняет ротацию, как описано выше.114115#### `emit(record)`116117Записывает запись (record) в файл, выполняя при необходимости ротацию, как описано ранее.118119## 15.9.6. TimedRotatingFileHandler120121Класс [`TimedRotatingFileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает ротацию файлов журнала на диске через заданные временные интервалы.122123#### `class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False)`124125Возвращает новый экземпляр класса [`TimedRotatingFileHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler). Указанный файл открывается и используется как поток для логирования. При ротации также устанавливается суффикс имени файла. Ротация происходит на основе произведения *when* и *interval*.126127Параметр *when* указывает тип *interval*. Список возможных значений приведён ниже. Обратите внимание, что регистр не учитывается.128129| Значение | Тип интервала |130| --- | --- |131| `'S'` | Секунды |132| `'M'` | Минуты |133| `'H'` | Часы |134| `'D'` | Дни |135| `'W0'-'W6'` | День недели (0=понедельник) |136| `'midnight'` | Переключение в полночь |137138При использовании ротации по дням недели укажите 'W0' для понедельника, 'W1' для вторника и так далее до 'W6' для воскресенья. В этом случае значение, переданное для *interval*, не используется.139140Система сохраняет старые файлы журнала, добавляя расширения к имени файла. Расширения основаны на дате и времени с использованием формата strftime `%Y-%m-%d_%H-%M-%S` или его начальной части в зависимости от интервала ротации.141142При первом вычислении времени следующей ротации (при создании обработчика) используется время последнего изменения существующего файла журнала или, в противном случае, текущее время, чтобы определить, когда произойдёт следующая ротация.143144Если аргумент *utc* равен true, используется время в UTC; в противном случае используется местное время.145146Если *backupCount* не равен нулю, сохраняется не более *backupCount* файлов; если при ротации должно быть создано больше файлов, самый старый удаляется. Логика удаления использует интервал для определения того, какие файлы нужно удалить, поэтому изменение интервала может привести к тому, что старые файлы останутся.147148Если *delay* равен true, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler.emit).149150Изменено в версии 2.6: *delay* и *utc* добавлены.151152#### `doRollover()`153154Выполняет ротацию, как описано выше.155156#### `emit(record)`157158Выводит запись в файл, обеспечивая ротацию, как описано выше.159160## 15.9.7. SocketHandler161162Класс [`SocketHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SocketHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), отправляет вывод журнала в сетевой сокет. Базовый класс использует TCP-сокет.163164#### `class logging.handlers.SocketHandler(host, port)`165166Возвращает новый экземпляр класса [`SocketHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SocketHandler), предназначенный для обмена данными с удалённой машиной, адрес которой задаётся параметрами *host* и *port*.167168#### `close()`169170Закрывает сокет.171172#### `emit()`173174Сериализует словарь атрибутов записи с помощью модуля pickle и записывает его в сокет в двоичном формате. При ошибке сокета пакет молча отбрасывается. Если соединение было потеряно, оно восстанавливается. Для десериализации записи на принимающей стороне в [`LogRecord`](https://python-all.ru/2.7/library/logging.html#logging.LogRecord) используйте функцию [`makeLogRecord()`](https://python-all.ru/2.7/library/logging.html#logging.makeLogRecord).175176#### `handleError()`177178Обрабатывает ошибку, возникшую во время [`emit()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SocketHandler.emit). Наиболее вероятная причина – потеря соединения. Закрывает сокет, чтобы повторить попытку при следующем событии.179180#### `makeSocket()`181182Это фабричный метод, который позволяет подклассам задать точный тип сокета. Реализация по умолчанию создаёт TCP-сокет ([`socket.SOCK_STREAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_STREAM)).183184#### `makePickle(record)`185186Сериализует словарь атрибутов записи в двоичном формате с префиксом длины и возвращает его готовым к передаче через сокет.187188Обратите внимание, что модуль pickle не является полностью безопасным. Если вас беспокоит безопасность, вы можете переопределить этот метод, чтобы реализовать более надёжный механизм. Например, можно подписывать данные с помощью HMAC и проверять подпись на принимающей стороне, либо отключить десериализацию глобальных объектов на принимающей стороне.189190#### `send(packet)`191192Отправляет сериализованную с помощью pickle строку *packet* в сокет. Эта функция допускает частичную отправку, которая может произойти, когда сеть занята.193194#### `createSocket()`195196Пытается создать сокет; в случае неудачи применяет алгоритм экспоненциальной отсрочки. При первой неудаче обработчик отбрасывает сообщение, которое пытался отправить. Когда последующие сообщения обрабатываются тем же экземпляром, он не будет пытаться установить соединение, пока не пройдёт некоторое время. Значения параметров по умолчанию таковы, что начальная задержка составляет одну секунду, и если после этой задержки соединение всё ещё не может быть установлено, обработчик будет удваивать задержку каждый раз вплоть до максимума в 30 секунд.197198Это поведение управляется следующими атрибутами обработчика:199200- `retryStart` (начальная задержка, по умолчанию 1,0 секунды).201- `retryFactor` (множитель, по умолчанию 2.0).202- `retryMax` (максимальная задержка, по умолчанию 30,0 секунд).203204Это означает, что если удалённый слушатель запускается *после* того, как обработчик уже использовался, возможна потеря сообщений (поскольку обработчик даже не будет пытаться установить соединение, пока не истечёт задержка, а будет просто молча отбрасывать сообщения в течение этого периода).205206## 15.9.8. DatagramHandler207208Класс [`DatagramHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.DatagramHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), наследует от [`SocketHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SocketHandler) для поддержки отправки сообщений журнала через UDP-сокеты.209210#### `class logging.handlers.DatagramHandler(host, port)`211212Возвращает новый экземпляр класса [`DatagramHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.DatagramHandler), предназначенный для обмена данными с удалённой машиной, адрес которой задаётся параметрами *host* и *port*.213214#### `emit()`215216Сериализует словарь атрибутов записи и записывает его в сокет в двоичном формате. В случае ошибки сокета молча отбрасывает пакет. Чтобы десериализовать запись на принимающей стороне в объект [`LogRecord`](https://python-all.ru/2.7/library/logging.html#logging.LogRecord), используйте функцию [`makeLogRecord()`](https://python-all.ru/2.7/library/logging.html#logging.makeLogRecord).217218#### `makeSocket()`219220Фабричный метод [`SocketHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SocketHandler) здесь переопределён для создания UDP-сокета ([`socket.SOCK_DGRAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_DGRAM)).221222#### `send(s)`223224Отправляет сериализованную с помощью pickle строку в сокет.225226## 15.9.9. SysLogHandler227228Класс [`SysLogHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SysLogHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала в удалённый или локальный системный журнал Unix (syslog).229230#### `class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)`231232Возвращает новый экземпляр класса [`SysLogHandler`](https://python-all.ru/2.7/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/2.7/library/socket.html#socket.SOCK_DGRAM), то есть открывается UDP-сокет. Чтобы открыть TCP-сокет (для работы с новыми демонами syslog, такими как rsyslog), укажите значение [`socket.SOCK_STREAM`](https://python-all.ru/2.7/library/socket.html#socket.SOCK_STREAM).233234Обратите внимание: если ваш сервер не прослушивает UDP-порт 514, [`SysLogHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SysLogHandler) может не работать. В этом случае проверьте, какой адрес следует использовать для доменного сокета – это зависит от системы. Например, в Linux это обычно '/dev/log', а в OS/X – '/var/run/syslog'. Необходимо проверить вашу платформу и использовать соответствующий адрес (возможно, потребуется выполнять эту проверку во время выполнения, если приложение должно работать на нескольких платформах). В Windows практически всегда приходится использовать UDP.235236Изменено в версии 2.7: *socktype* добавлен.237238#### `close()`239240Закрывает сокет, подключённый к удалённому узлу.241242#### `emit(record)`243244Запись форматируется и отправляется на сервер syslog. Если присутствует информация об исключении, она *не* отправляется на сервер.245246#### `encodePriority(facility, priority)`247248Кодирует средство и приоритет в целое число. Можно передавать строки или целые числа – если передаются строки, внутренние словари сопоставлений используются для преобразования их в целые числа.249250Символические значения `LOG_` определены в [`SysLogHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SysLogHandler) и отражают значения, определённые в заголовочном файле `sys/syslog.h`.251252**Приоритеты**253254| Имя (строка) | Символическое значение |255| --- | --- |256| `alert` | LOG\_ALERT |257| `crit` или `critical` | LOG\_CRIT |258| `debug` | LOG\_DEBUG |259| `emerg` или `panic` | LOG\_EMERG |260| `err` или `error` | LOG\_ERR |261| `info` | LOG\_INFO |262| `notice` | LOG\_NOTICE |263| `warn` или `warning` | LOG\_WARNING |264265**Средства**266267| Имя (строка) | Символическое значение |268| --- | --- |269| `auth` | LOG\_AUTH |270| `authpriv` | LOG\_AUTHPRIV |271| `cron` | LOG\_CRON |272| `daemon` | LOG\_DAEMON |273| `ftp` | LOG\_FTP |274| `kern` | LOG\_KERN |275| `lpr` | LOG\_LPR |276| `mail` | LOG\_MAIL |277| `news` | LOG\_NEWS |278| `syslog` | LOG\_SYSLOG |279| `user` | LOG\_USER |280| `uucp` | LOG\_UUCP |281| `local0` | LOG\_LOCAL0 |282| `local1` | LOG\_LOCAL1 |283| `local2` | LOG\_LOCAL2 |284| `local3` | LOG\_LOCAL3 |285| `local4` | LOG\_LOCAL4 |286| `local5` | LOG\_LOCAL5 |287| `local6` | LOG\_LOCAL6 |288| `local7` | LOG\_LOCAL7 |289290#### `mapPriority(levelname)`291292Сопоставляет имя уровня логирования с именем приоритета syslog. Возможно, потребуется переопределить этот метод, если используются пользовательские уровни или если алгоритм по умолчанию не подходит. Алгоритм по умолчанию сопоставляет `DEBUG`, `INFO`, `WARNING`, `ERROR` и `CRITICAL` с соответствующими именами syslog, а все остальные имена уровней – с 'warning'.293294## 15.9.10. NTEventLogHandler295296Класс [`NTEventLogHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.NTEventLogHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений логирования в локальный журнал событий Windows NT, Windows 2000 или Windows XP. Перед использованием необходимо установить расширения Win32 для Python от Марка Хаммонда.297298#### `class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')`299300Возвращает новый экземпляр класса [`NTEventLogHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.NTEventLogHandler). Аргумент *appname* используется для определения имени приложения, отображаемого в журнале событий. С использованием этого имени создаётся соответствующая запись в реестре. *dllname* должен содержать полный путь к .dll или .exe, содержащему определения сообщений для размещения в журнале (если не указан, используется `'win32service.pyd'` – он устанавливается вместе с расширениями Win32 и содержит несколько базовых placeholder-определений сообщений. Обратите внимание: использование этих placeholder-ов приведёт к увеличению размера журналов событий, так как в журнал сохраняется весь исходный код сообщения. Если нужны более компактные журналы, необходимо передать имя собственного .dll или .exe, содержащего желаемые определения сообщений). *logtype* – одно из `'Application'`, `'System'` или `'Security'`, по умолчанию `'Application'`.301302#### `close()`303304На этом этапе можно удалить имя приложения из реестра как источник записей журнала событий. Однако после этого события не будут отображаться в средстве просмотра журнала событий так, как предполагалось – для получения имени .dll требуется доступ к реестру. Текущая версия этого не делает.305306#### `emit(record)`307308Определяет идентификатор сообщения, категорию и тип события, а затем записывает сообщение в журнал событий NT.309310#### `getEventCategory(record)`311312Возвращает категорию события для записи. Переопределите этот метод, чтобы указать собственные категории. Данная версия возвращает 0.313314#### `getEventType(record)`315316Возвращает тип события для записи. Переопределите этот метод, чтобы указать собственные типы. Данная версия выполняет сопоставление с помощью атрибута typemap обработчика, который устанавливается в [`__init__()`](https://python-all.ru/2.7/reference/datamodel.html#object.__init__) как словарь, содержащий сопоставления для `DEBUG`, `INFO`, `WARNING`, `ERROR` и `CRITICAL`. Если используются собственные уровни, необходимо либо переопределить этот метод, либо поместить подходящий словарь в атрибут *typemap* обработчика.317318#### `getMessageID(record)`319320Возвращает идентификатор сообщения для записи. Если используются собственные сообщения, можно передавать *msg* в логгер как идентификатор, а не как строку форматирования. Затем в этом методе можно выполнить поиск по словарю для получения идентификатора сообщения. Данная версия возвращает 1 – базовый идентификатор сообщения в `win32service.pyd`.321322## 15.9.11. SMTPHandler323324Класс [`SMTPHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SMTPHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений логирования на адрес электронной почты через SMTP.325326#### `class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None)`327328Возвращает новый экземпляр класса [`SMTPHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.SMTPHandler). Экземпляр инициализируется адресами отправителя и получателя, а также темой письма. *toaddrs* должен быть списком строк. Для указания нестандартного SMTP-порта используйте формат кортежа (host, port) для аргумента *mailhost*. Если используется строка, применяется стандартный порт SMTP. Если SMTP-сервер требует аутентификации, можно указать кортеж (имя\_пользователя, пароль) для аргумента *credentials*.329330Чтобы указать использование защищённого протокола (TLS), передайте кортеж в аргумент *secure*. Он будет использоваться только при наличии учётных данных аутентификации. Кортеж должен быть либо пустым, либо содержать одно значение – имя файла ключа, либо два значения: имя файла ключа и сертификата. (Этот кортеж передаётся методу [`smtplib.SMTP.starttls()`](https://python-all.ru/2.7/library/smtplib.html#smtplib.SMTP.starttls).)331332Изменено в версии 2.6: *credentials* был добавлен.333334Изменено в версии 2.7: *secure* был добавлен.335336#### `emit(record)`337338Форматирует запись и отправляет её указанным получателям.339340#### `getSubject(record)`341342Чтобы задать тему письма, зависящую от записи, переопределите этот метод.343344## 15.9.12. MemoryHandler345346Класс [`MemoryHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.MemoryHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает буферизацию записей журнала в памяти с периодическим сбросом в целевой обработчик *target*. Сброс происходит, когда буфер заполнен или когда встречается событие указанного уровня важности или выше.347348[`MemoryHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.MemoryHandler) является подклассом более общего [`BufferingHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.BufferingHandler), который является абстрактным классом. Он буферизует записи журнала в памяти. При добавлении каждой записи в буфер вызывается `shouldFlush()` для проверки необходимости сброса. Если сброс нужен, то `flush()` выполняет его.349350#### `class logging.handlers.BufferingHandler(capacity)`351352Инициализирует обработчик буфером указанной ёмкости.353354#### `emit(record)`355356Добавляет запись в буфер. Если [`shouldFlush()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.BufferingHandler.shouldFlush) возвращает true, вызывает [`flush()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.BufferingHandler.flush) для обработки буфера.357358#### `flush()`359360Вы можете переопределить этот метод, чтобы задать собственное поведение при сбросе. Текущая версия просто очищает буфер.361362#### `shouldFlush(record)`363364Возвращает true, если буфер заполнен до ёмкости. Этот метод можно переопределить для реализации собственных стратегий сброса.365366#### `class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None)`367368Возвращает новый экземпляр класса [`MemoryHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.MemoryHandler). Экземпляр инициализируется с размером буфера *capacity*. Если *flushLevel* не указан, используется `ERROR`. Если *target* не указан, то перед тем, как обработчик начнёт что-то делать, его нужно будет задать с помощью [`setTarget()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.MemoryHandler.setTarget).369370#### `close()`371372Вызывает [`flush()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.MemoryHandler.flush), устанавливает целевой обработчик в [`None`](https://python-all.ru/2.7/library/constants.html#None) и очищает буфер.373374#### `flush()`375376Для [`MemoryHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.MemoryHandler) сброс означает просто отправку буферизованных записей целевому объекту, если он задан. Буфер также очищается при этом. Переопределите, если требуется другое поведение.377378#### `setTarget(target)`379380Устанавливает целевой обработчик для данного обработчика.381382#### `shouldFlush(record)`383384Проверяет, заполнен ли буфер или поступила запись уровня *flushLevel* или выше.385386## 15.9.13. HTTPHandler387388Класс [`HTTPHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.HTTPHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/2.7/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала на веб-сервер с использованием семантики `GET` или `POST`.389390#### `class logging.handlers.HTTPHandler(host, url, method='GET')`391392Возвращает новый экземпляр класса [`HTTPHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.HTTPHandler). `host` может иметь форму `host:port`, если необходимо использовать определённый номер порта.393394#### `mapLogRecord(record)`395396Возвращает словарь на основе `record`, который должен быть закодирован в URL-кодировку и отправлен на веб-сервер. Реализация по умолчанию просто возвращает `record.__dict__`. Этот метод можно переопределить, если, например, на веб-сервер нужно отправить только подмножество [`LogRecord`](https://python-all.ru/2.7/library/logging.html#logging.LogRecord), или если требуется более точная настройка того, что отправляется на сервер.397398#### `emit(record)`399400Отправляет запись на веб-сервер в виде словаря, закодированного в URL. Для преобразования записи в отправляемый словарь используется метод [`mapLogRecord()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.HTTPHandler.mapLogRecord).401402> **Примечание**403>404> Поскольку подготовка записи для отправки на веб-сервер не является обычной операцией форматирования, использование `setFormatter()` для указания `Formatter` для [`HTTPHandler`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.HTTPHandler) не даёт эффекта. Вместо вызова [`format()`](https://python-all.ru/2.7/library/functions.html#format) этот обработчик вызывает [`mapLogRecord()`](https://python-all.ru/2.7/library/logging.handlers.html#logging.handlers.HTTPHandler.mapLogRecord), а затем [`urllib.urlencode()`](https://python-all.ru/2.7/library/urllib.html#urllib.urlencode) для кодирования словаря в форму, пригодную для отправки на веб-сервер.405406> **См. также**407>408> **Модуль [`logging`](https://python-all.ru/2.7/library/logging.html#module-logging)**409>410> Справочник API для модуля logging.411>412> **Модуль [`logging.config`](https://python-all.ru/2.7/library/logging.config.html#module-logging.config)**413>414> API конфигурации для модуля logging.415