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

logging.handlers.md

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

1> **Источник:** https://python-all.ru/3.8/library/logging.handlers.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers) – Обработчики логирования89**Исходный код:** [Lib/logging/handlers.py](https://python-all.ru/src/3.8/Lib/logging/handlers.py)1011Важно1213На этой странице представлена только справочная информация. Учебные руководства см. в1415- [Базовое руководство](https://python-all.ru/3.8/howto/logging.html#logging-basic-tutorial)16- [Продвинутое руководство](https://python-all.ru/3.8/howto/logging.html#logging-advanced-tutorial)17- [Поваренная книга по логированию](https://python-all.ru/3.8/howto/logging-cookbook.html#logging-cookbook)1819---2021В пакете представлены следующие полезные обработчики. Обратите внимание, что три из них ([`StreamHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.StreamHandler), [`FileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.FileHandler) и [`NullHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.NullHandler)) на самом деле определены в самом модуле [`logging`](https://python-all.ru/3.8/library/logging.html#module-logging), но документированы здесь вместе с остальными обработчиками.2223## StreamHandler2425Класс [`StreamHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.StreamHandler), находящийся в основном пакете [`logging`](https://python-all.ru/3.8/library/logging.html#module-logging), отправляет вывод логирования в потоки данных, такие как *sys.stdout*, *sys.stderr* или любой объект, похожий на файл (или, точнее, любой объект, который поддерживает методы `write()` и `flush()`).2627#### `class logging.StreamHandler(stream=None)`2829Возвращает новый экземпляр класса [`StreamHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.StreamHandler). Если указан *stream*, экземпляр будет использовать его для вывода логирования; в противном случае будет использоваться *sys.stderr*.3031#### `emit(record)`3233Если указан форматировщик, он используется для форматирования записи. Затем запись записывается в поток с терминатором. Если присутствует информация об исключении, она форматируется с помощью [`traceback.print_exception()`](https://python-all.ru/3.8/library/traceback.html#traceback.print_exception) и добавляется в поток.3435#### `flush()`3637Сбрасывает поток данных вызовом его метода [`flush()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.StreamHandler.flush). Обратите внимание, что метод `close()` наследуется от [`Handler`](https://python-all.ru/3.8/library/logging.html#logging.Handler) и поэтому не производит вывода, так что иногда может потребоваться явный вызов [`flush()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.StreamHandler.flush).3839#### `setStream(stream)`4041Устанавливает поток данных экземпляра на указанное значение, если оно отличается. Старый поток данных сбрасывается перед установкой нового.4243**Параметры**4445**stream** – Поток данных, который должен использовать обработчик.4647**Возвращает**4849старый поток, если поток был изменён, или *None*, если нет.5051Добавлено в версии 3.7.5253Изменено в версии 3.2: Класс `StreamHandler` теперь имеет атрибут `terminator` со значением по умолчанию `'\n'`, который используется как терминатор при записи отформатированной записи в поток. Если такое завершение строкой не требуется, можно установить атрибут `terminator` экземпляра обработчика в пустую строку. В более ранних версиях терминатор был жёстко задан как `'\n'`.5455## FileHandler5657Класс [`FileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.FileHandler), находящийся в основном пакете [`logging`](https://python-all.ru/3.8/library/logging.html#module-logging), направляет вывод журнала в файл на диске. Он наследует функциональность вывода от [`StreamHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.StreamHandler).5859#### `class logging.FileHandler(filename, mode='a', encoding=None, delay=False)`6061Возвращает новый экземпляр класса [`FileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.FileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен `None`, он используется для открытия файла с указанной кодировкой. Если *delay* истинно, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.FileHandler.emit). По умолчанию файл растёт бесконечно.6263Изменено в версии 3.6: Помимо строковых значений, для аргумента *filename* теперь принимаются также объекты [`Path`](https://python-all.ru/3.8/library/pathlib.html#pathlib.Path).6465#### `close()`6667Закрывает файл.6869#### `emit(record)`7071Выводит запись в файл.7273## NullHandler7475Новое в версии 3.1.7677Класс [`NullHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.NullHandler), находящийся в основном пакете [`logging`](https://python-all.ru/3.8/library/logging.html#module-logging), не выполняет никакого форматирования или вывода. По сути это обработчик-пустышка (‘no-op’), предназначенный для разработчиков библиотек.7879#### `class logging.NullHandler`8081Возвращает новый экземпляр класса [`NullHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.NullHandler).8283#### `emit(record)`8485Этот метод ничего не делает.8687#### `handle(record)`8889Этот метод ничего не делает.9091#### `createLock()`9293Этот метод возвращает `None` для блокировки, так как нет базового ввода-вывода, доступ к которому нужно сериализовать.9495См. [Настройка журналирования для библиотеки](https://python-all.ru/3.8/howto/logging.html#library-config) для получения дополнительной информации об использовании [`NullHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.NullHandler).9697## WatchedFileHandler9899Класс [`WatchedFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.WatchedFileHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), представляет собой `FileHandler`, который отслеживает файл, в который ведётся журналирование. Если файл изменяется, он закрывается и снова открывается по тому же имени.100101Файл может измениться из-за использования таких программ, как *newsyslog* и *logrotate*, которые выполняют ротацию файлов журнала. Этот обработчик, предназначенный для использования в Unix/Linux, следит, не изменился ли файл с момента последнего вызова emit. (Считается, что файл изменился, если изменились его устройство или inode.) Если файл изменился, старый поток файла закрывается, а файл открывается для получения нового потока.102103Этот обработчик не подходит для использования в Windows, потому что в Windows открытые файлы журнала нельзя перемещать или переименовывать – журналирование открывает файлы с эксклюзивными блокировками, – поэтому такой обработчик не нужен. Кроме того, *ST\_INO* не поддерживается в Windows; [`stat()`](https://python-all.ru/3.8/library/os.html#os.stat) всегда возвращает ноль для этого значения.104105#### `class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False)`106107Возвращает новый экземпляр класса [`WatchedFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.WatchedFileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен `None`, он используется для открытия файла с указанной кодировкой. Если *delay* истинно, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.WatchedFileHandler.emit). По умолчанию файл растёт бесконечно.108109Изменено в версии 3.6: Помимо строковых значений, для аргумента *filename* теперь принимаются также объекты [`Path`](https://python-all.ru/3.8/library/pathlib.html#pathlib.Path).110111#### `reopenIfNeeded()`112113Проверяет, изменился ли файл. Если изменился, существующий поток данных сбрасывается и закрывается, а файл открывается заново, обычно перед выводом записи в файл.114115Новое в версии 3.6.116117#### `emit(record)`118119Выводит запись в файл, но сначала вызывает [`reopenIfNeeded()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.WatchedFileHandler.reopenIfNeeded), чтобы переоткрыть файл, если он изменился.120121## BaseRotatingHandler122123Класс [`BaseRotatingHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BaseRotatingHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), является базовым классом для ротируемых файловых обработчиков [`RotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.RotatingFileHandler) и [`TimedRotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler). Обычно не требуется создавать экземпляр этого класса, но у него есть атрибуты и методы, которые может потребоваться переопределить.124125#### `class logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False)`126127Параметры такие же, как для `FileHandler`. Атрибуты:128129#### `namer`130131Если этому атрибуту присвоен вызываемый объект, метод [`rotation_filename()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BaseRotatingHandler.rotation_filename) делегирует вызов этому объекту. Параметры, передаваемые вызываемому объекту, такие же, как у [`rotation_filename()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BaseRotatingHandler.rotation_filename).132133> **Примечание**134>135> Функция namer вызывается довольно много раз во время ротации, поэтому она должна быть максимально простой и быстрой. Она также должна возвращать одинаковый результат для одного и того же входного значения, иначе поведение ротации может не соответствовать ожидаемому.136137Новое в версии 3.3.138139#### `rotator`140141Если этому атрибуту присвоен вызываемый объект, метод [`rotate()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BaseRotatingHandler.rotate) делегирует вызов этому объекту. Параметры, передаваемые вызываемому объекту, такие же, как у [`rotate()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BaseRotatingHandler.rotate).142143Новое в версии 3.3.144145#### `rotation_filename(default_name)`146147Изменяет имя файла журнала при ротации.148149Это предусмотрено, чтобы можно было задать пользовательское имя файла.150151Реализация по умолчанию вызывает атрибут ‘namer’ обработчика, если он вызываем, передавая ему имя по умолчанию. Если атрибут не является вызываемым (по умолчанию `None`), имя возвращается без изменений.152153**Параметры**154155**default\_name** – имя файла журнала по умолчанию.156157Новое в версии 3.3.158159#### `rotate(source, dest)`160161При ротации выполняет ротацию текущего журнала.162163Реализация по умолчанию вызывает атрибут ‘rotator’ обработчика, если он вызываем, передавая ему аргументы source и dest. Если атрибут не вызываем (по умолчанию `None`), source просто переименовывается в destination.164165**Параметры**166167- **source** – исходное имя файла. Обычно это базовое имя файла, например ‘test.log’.168- **dest** – имя файла назначения. Обычно это то, во что ротируется source, например ‘test.log.1’.169170Новое в версии 3.3.171172Атрибуты существуют, чтобы избавить от необходимости создавать подклассы – можно использовать одни и те же вызываемые объекты для экземпляров [`RotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.RotatingFileHandler) и [`TimedRotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler). Если какой-либо из вызываемых объектов namer или rotator вызывает исключение, оно обрабатывается так же, как и любое другое исключение во время вызова `emit()`, то есть через метод `handleError()` обработчика.173174Если требуется внести более существенные изменения в обработку ротации, можно переопределить методы.175176Пример см. в [Использование rotator и namer для настройки обработки ротации журналов](https://python-all.ru/3.8/howto/logging-cookbook.html#cookbook-rotator-namer).177178## RotatingFileHandler179180Класс [`RotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.RotatingFileHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает ротацию файлов журнала на диске.181182#### `class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False)`183184Возвращает новый экземпляр класса [`RotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.RotatingFileHandler). Указанный файл открывается и используется как поток для логирования. Если *mode* не указан, используется `'a'`. Если *encoding* не равен `None`, он используется для открытия файла с указанной кодировкой. Если *delay* истинно, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.RotatingFileHandler.emit). По умолчанию файл растёт бесконечно.185186Значения *maxBytes* и *backupCount* позволяют задать *ротацию (rollover)* файла по достижении заданного размера. Когда размер вот-вот будет превышен, файл закрывается и новый файл незаметно открывается для записи. Ротация происходит каждый раз, когда текущий файл журнала почти достигает длины *maxBytes*; но если *maxBytes* или *backupCount* равно нулю, ротация не выполняется, поэтому обычно рекомендуется установить *backupCount* не менее 1, а *maxBytes* – ненулевым. Когда *backupCount* не равен нулю, система сохраняет старые файлы журнала, добавляя к имени файла расширения '.1', '.2' и т. д. Например, при *backupCount*, равном 5, и базовом имени файла `app.log`, вы получите файлы `app.log`, `app.log.1`, `app.log.2`, вплоть до `app.log.5`. Файл, в который ведётся запись, всегда `app.log`. Когда этот файл заполняется, он закрывается и переименовывается в `app.log.1`, а если существуют файлы `app.log.1`, `app.log.2` и т. д., то они переименовываются соответственно в `app.log.2`, `app.log.3` и т. д.187188Изменено в версии 3.6: Помимо строковых значений, для аргумента *filename* теперь принимаются также объекты [`Path`](https://python-all.ru/3.8/library/pathlib.html#pathlib.Path).189190#### `doRollover()`191192Выполняет ротацию, как описано выше.193194#### `emit(record)`195196Записывает запись (record) в файл, выполняя при необходимости ротацию, как описано ранее.197198## TimedRotatingFileHandler199200Класс [`TimedRotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает ротацию файлов журнала на диске через заданные временные интервалы.201202#### `class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)`203204Возвращает новый экземпляр класса [`TimedRotatingFileHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler). Указанный файл открывается и используется как поток для логирования. При ротации также устанавливается суффикс имени файла. Ротация происходит на основе произведения *when* и *interval*.205206Параметр *when* указывает тип *interval*. Список возможных значений приведён ниже. Обратите внимание, что регистр не учитывается.207208| Значение | Тип интервала | Используется ли *atTime* и как |209| --- | --- | --- |210| `'S'` | Секунды | Игнорируется |211| `'M'` | Минуты | Игнорируется |212| `'H'` | Часы | Игнорируется |213| `'D'` | Дни | Игнорируется |214| `'W0'-'W6'` | День недели (0=понедельник) | Используется для вычисления начального времени ротации |215| `'midnight'` | Ротация в полночь, если *atTime* не указан, иначе в момент времени *atTime* | Используется для вычисления начального времени ротации |216217При использовании ротации по дням недели укажите 'W0' для понедельника, 'W1' для вторника и так далее до 'W6' для воскресенья. В этом случае значение, переданное для *interval*, не используется.218219Система сохраняет старые файлы журнала, добавляя расширения к имени файла. Расширения основаны на дате и времени с использованием формата strftime `%Y-%m-%d_%H-%M-%S` или его начальной части в зависимости от интервала ротации.220221При первом вычислении времени следующей ротации (при создании обработчика) используется время последнего изменения существующего файла журнала или, в противном случае, текущее время, чтобы определить, когда произойдёт следующая ротация.222223Если аргумент *utc* равен true, используется время в UTC; в противном случае используется местное время.224225Если *backupCount* не равен нулю, сохраняется не более *backupCount* файлов; если при ротации должно быть создано больше файлов, самый старый удаляется. Логика удаления использует интервал для определения того, какие файлы нужно удалить, поэтому изменение интервала может привести к тому, что старые файлы останутся.226227Если *delay* равен true, открытие файла откладывается до первого вызова [`emit()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.TimedRotatingFileHandler.emit).228229Если *atTime* не равен `None`, он должен быть экземпляром `datetime.time`, который задаёт время суток для ротации в случаях, когда ротация должна происходить «в полночь» или «в определённый день недели». Обратите внимание, что в этих случаях значение *atTime* фактически используется для вычисления *первой* ротации, а последующие ротации рассчитываются обычным образом по интервалу.230231> **Примечание**232>233> Расчёт времени первой ротации выполняется при инициализации обработчика. Расчёт последующих ротаций выполняется только при наступлении ротации, а ротация происходит только при выводе записи. Если это не учитывать, может возникнуть путаница. Например, если задан интервал «каждую минуту», это не означает, что временные метки в именах файлов всегда будут отличаться ровно на минуту; если во время выполнения приложения записи журнала генерируются чаще, чем раз в минуту, *то* можно ожидать, что временные метки файлов будут разделены минутой. Если же записи журнала выводятся только раз в пять минут (скажем), то в именах файлов будут пропуски, соответствующие минутам, когда не было вывода (и, следовательно, ротации).234235Изменено в версии 3.4: Добавлен параметр *atTime*.236237Изменено в версии 3.6: Помимо строковых значений, для аргумента *filename* теперь принимаются также объекты [`Path`](https://python-all.ru/3.8/library/pathlib.html#pathlib.Path).238239#### `doRollover()`240241Выполняет ротацию, как описано выше.242243#### `emit(record)`244245Выводит запись в файл, обеспечивая ротацию, как описано выше.246247## SocketHandler248249Класс [`SocketHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), отправляет вывод журнала в сетевой сокет. Базовый класс использует TCP-сокет.250251#### `class logging.handlers.SocketHandler(host, port)`252253Возвращает новый экземпляр класса [`SocketHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler), предназначенный для обмена данными с удалённой машиной, адрес которой задаётся параметрами *host* и *port*.254255Изменено в версии 3.4: Если `port` указан как `None`, создаётся сокет домена Unix с использованием значения `host`; в противном случае создаётся TCP-сокет.256257#### `close()`258259Закрывает сокет.260261#### `emit()`262263Сериализует словарь атрибутов записи с помощью модуля pickle и записывает его в сокет в двоичном формате. При ошибке сокета пакет молча отбрасывается. Если соединение было потеряно, оно восстанавливается. Для десериализации записи на принимающей стороне в [`LogRecord`](https://python-all.ru/3.8/library/logging.html#logging.LogRecord) используйте функцию [`makeLogRecord()`](https://python-all.ru/3.8/library/logging.html#logging.makeLogRecord).264265#### `handleError()`266267Обрабатывает ошибку, возникшую во время [`emit()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler.emit). Наиболее вероятная причина – потеря соединения. Закрывает сокет, чтобы повторить попытку при следующем событии.268269#### `makeSocket()`270271Это фабричный метод, который позволяет подклассам задать точный тип сокета. Реализация по умолчанию создаёт TCP-сокет ([`socket.SOCK_STREAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_STREAM)).272273#### `makePickle(record)`274275Сериализует словарь атрибутов записи с помощью модуля pickle в двоичном формате с префиксом длины и возвращает его, готовым к отправке через сокет. Подробности этой операции эквивалентны следующему:276277```python278data = pickle.dumps(record_attr_dict, 1)279datalen = struct.pack('>L', len(data))280return datalen + data281```282283Обратите внимание, что модуль pickle не является полностью безопасным. Если вас беспокоит безопасность, вы можете переопределить этот метод, чтобы реализовать более надёжный механизм. Например, можно подписывать данные с помощью HMAC и проверять подпись на принимающей стороне, либо отключить десериализацию глобальных объектов на принимающей стороне.284285#### `send(packet)`286287Отправляет сериализованную байтовую строку *пакет* в сокет. Формат отправляемой байтовой строки описан в документации [`makePickle()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler.makePickle).288289Эта функция допускает частичную отправку, что может произойти при загруженности сети.290291#### `createSocket()`292293Пытается создать сокет; в случае неудачи применяет алгоритм экспоненциальной отсрочки. При первой неудаче обработчик отбрасывает сообщение, которое пытался отправить. Когда последующие сообщения обрабатываются тем же экземпляром, он не будет пытаться установить соединение, пока не пройдёт некоторое время. Значения параметров по умолчанию таковы, что начальная задержка составляет одну секунду, и если после этой задержки соединение всё ещё не может быть установлено, обработчик будет удваивать задержку каждый раз вплоть до максимума в 30 секунд.294295Это поведение управляется следующими атрибутами обработчика:296297- `retryStart` (начальная задержка, по умолчанию 1,0 секунды).298- `retryFactor` (множитель, по умолчанию 2.0).299- `retryMax` (максимальная задержка, по умолчанию 30,0 секунд).300301Это означает, что если удалённый слушатель запускается *после* того, как обработчик уже использовался, возможна потеря сообщений (поскольку обработчик даже не будет пытаться установить соединение, пока не истечёт задержка, а будет просто молча отбрасывать сообщения в течение этого периода).302303## DatagramHandler304305Класс [`DatagramHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.DatagramHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), наследует от [`SocketHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler) для поддержки отправки сообщений журнала через UDP-сокеты.306307#### `class logging.handlers.DatagramHandler(host, port)`308309Возвращает новый экземпляр класса [`DatagramHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.DatagramHandler), предназначенный для обмена данными с удалённой машиной, адрес которой задаётся параметрами *host* и *port*.310311Изменено в версии 3.4: Если `port` задан как `None`, создаётся доменный сокет Unix с использованием значения `host`; в противном случае создаётся UDP-сокет.312313#### `emit()`314315Сериализует словарь атрибутов записи и записывает его в сокет в двоичном формате. В случае ошибки сокета молча отбрасывает пакет. Чтобы десериализовать запись на принимающей стороне в объект [`LogRecord`](https://python-all.ru/3.8/library/logging.html#logging.LogRecord), используйте функцию [`makeLogRecord()`](https://python-all.ru/3.8/library/logging.html#logging.makeLogRecord).316317#### `makeSocket()`318319Фабричный метод [`SocketHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler) здесь переопределён для создания UDP-сокета ([`socket.SOCK_DGRAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_DGRAM)).320321#### `send(s)`322323Отправляет сериализованную (pickled) байтовую строку в сокет. Формат отправляемой байтовой строки описан в документации [`SocketHandler.makePickle()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SocketHandler.makePickle).324325## SysLogHandler326327Класс [`SysLogHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SysLogHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала в удалённый или локальный системный журнал Unix (syslog).328329#### `class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)`330331Возвращает новый экземпляр класса [`SysLogHandler`](https://python-all.ru/3.8/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.8/library/socket.html#socket.SOCK_DGRAM), то есть открывается UDP-сокет. Чтобы открыть TCP-сокет (для работы с новыми демонами syslog, такими как rsyslog), укажите значение [`socket.SOCK_STREAM`](https://python-all.ru/3.8/library/socket.html#socket.SOCK_STREAM).332333Обратите внимание: если ваш сервер не прослушивает UDP-порт 514, [`SysLogHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SysLogHandler) может не работать. В этом случае проверьте, какой адрес следует использовать для доменного сокета – это зависит от системы. Например, в Linux это обычно '/dev/log', а в OS/X – '/var/run/syslog'. Необходимо проверить вашу платформу и использовать соответствующий адрес (возможно, потребуется выполнять эту проверку во время выполнения, если приложение должно работать на нескольких платформах). В Windows практически всегда приходится использовать UDP.334335Изменено в версии 3.2: добавлен параметр *socktype*.336337#### `close()`338339Закрывает сокет, подключённый к удалённому узлу.340341#### `emit(record)`342343Запись форматируется и отправляется на сервер syslog. Если присутствует информация об исключении, она *не* отправляется на сервер.344345Изменено в версии 3.2.1: (См.: [bpo-12168](https://python-all.ru/3.8/library/logging.handlers.html).) В более ранних версиях сообщение, отправляемое демонам syslog, всегда завершалось нулевым байтом (NUL), поскольку ранние версии этих демонов ожидали сообщение, завершённое нулём, – хотя в соответствующей спецификации ([**RFC 5424**](https://python-all.ru/3.8/library/logging.handlers.html)) этого нет. Более новые версии этих демонов не ожидают нулевой байт, но отбрасывают его, если он присутствует, а ещё более новые демоны (которые строже следуют RFC 5424) передают нулевой байт как часть сообщения.346347Чтобы упростить обработку сообщений syslog в условиях такого различного поведения демонов, добавление нулевого байта было сделано настраиваемым с помощью атрибута уровня класса, `append_nul`. По умолчанию он равен `True` (сохраняя существующее поведение), но может быть установлен в `False` на экземпляре `SysLogHandler`, чтобы этот экземпляр *не* добавлял нулевой терминатор.348349Изменено в версии 3.3: (См.: [bpo-12419](https://python-all.ru/3.8/library/logging.handlers.html).) В более ранних версиях не было возможности указать префикс «ident» или «tag» для идентификации источника сообщения. Теперь это можно задать с помощью атрибута уровня класса, по умолчанию равного `""` для сохранения существующего поведения, но который может быть переопределён на экземпляре `SysLogHandler`, чтобы этот экземпляр добавлял идентификатор к каждому обработанному сообщению. Обратите внимание, что указанный идентификатор должен быть текстом, а не байтами, и добавляется к сообщению без изменений.350351#### `encodePriority(facility, priority)`352353Кодирует средство и приоритет в целое число. Можно передавать строки или целые числа – если передаются строки, внутренние словари сопоставлений используются для преобразования их в целые числа.354355Символические значения `LOG_` определены в [`SysLogHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SysLogHandler) и отражают значения, определённые в заголовочном файле `sys/syslog.h`.356357**Приоритеты**358359| Имя (строка) | Символическое значение |360| --- | --- |361| `alert` | LOG\_ALERT |362| `crit` или `critical` | LOG\_CRIT |363| `debug` | LOG\_DEBUG |364| `emerg` или `panic` | LOG\_EMERG |365| `err` или `error` | LOG\_ERR |366| `info` | LOG\_INFO |367| `notice` | LOG\_NOTICE |368| `warn` или `warning` | LOG\_WARNING |369370**Средства**371372| Имя (строка) | Символическое значение |373| --- | --- |374| `auth` | LOG\_AUTH |375| `authpriv` | LOG\_AUTHPRIV |376| `cron` | LOG\_CRON |377| `daemon` | LOG\_DAEMON |378| `ftp` | LOG\_FTP |379| `kern` | LOG\_KERN |380| `lpr` | LOG\_LPR |381| `mail` | LOG\_MAIL |382| `news` | LOG\_NEWS |383| `syslog` | LOG\_SYSLOG |384| `user` | LOG\_USER |385| `uucp` | LOG\_UUCP |386| `local0` | LOG\_LOCAL0 |387| `local1` | LOG\_LOCAL1 |388| `local2` | LOG\_LOCAL2 |389| `local3` | LOG\_LOCAL3 |390| `local4` | LOG\_LOCAL4 |391| `local5` | LOG\_LOCAL5 |392| `local6` | LOG\_LOCAL6 |393| `local7` | LOG\_LOCAL7 |394395#### `mapPriority(levelname)`396397Сопоставляет имя уровня логирования с именем приоритета syslog. Возможно, потребуется переопределить этот метод, если используются пользовательские уровни или если алгоритм по умолчанию не подходит. Алгоритм по умолчанию сопоставляет `DEBUG`, `INFO`, `WARNING`, `ERROR` и `CRITICAL` с соответствующими именами syslog, а все остальные имена уровней – с 'warning'.398399## NTEventLogHandler400401Класс [`NTEventLogHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.NTEventLogHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений логирования в локальный журнал событий Windows NT, Windows 2000 или Windows XP. Перед использованием необходимо установить расширения Win32 для Python от Марка Хаммонда.402403#### `class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')`404405Возвращает новый экземпляр класса [`NTEventLogHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.NTEventLogHandler). Аргумент *appname* используется для определения имени приложения, отображаемого в журнале событий. С использованием этого имени создаётся соответствующая запись в реестре. *dllname* должен содержать полный путь к .dll или .exe, содержащему определения сообщений для размещения в журнале (если не указан, используется `'win32service.pyd'` – он устанавливается вместе с расширениями Win32 и содержит несколько базовых placeholder-определений сообщений. Обратите внимание: использование этих placeholder-ов приведёт к увеличению размера журналов событий, так как в журнал сохраняется весь исходный код сообщения. Если нужны более компактные журналы, необходимо передать имя собственного .dll или .exe, содержащего желаемые определения сообщений). *logtype* – одно из `'Application'`, `'System'` или `'Security'`, по умолчанию `'Application'`.406407#### `close()`408409На этом этапе можно удалить имя приложения из реестра как источник записей журнала событий. Однако после этого события не будут отображаться в средстве просмотра журнала событий так, как предполагалось – для получения имени .dll требуется доступ к реестру. Текущая версия этого не делает.410411#### `emit(record)`412413Определяет идентификатор сообщения, категорию и тип события, а затем записывает сообщение в журнал событий NT.414415#### `getEventCategory(record)`416417Возвращает категорию события для записи. Переопределите этот метод, чтобы указать собственные категории. Данная версия возвращает 0.418419#### `getEventType(record)`420421Возвращает тип события для записи. Переопределите этот метод, чтобы указать собственные типы. Данная версия выполняет сопоставление с помощью атрибута typemap обработчика, который устанавливается в [`__init__()`](https://python-all.ru/3.8/reference/datamodel.html#object.__init__) как словарь, содержащий сопоставления для `DEBUG`, `INFO`, `WARNING`, `ERROR` и `CRITICAL`. Если используются собственные уровни, необходимо либо переопределить этот метод, либо поместить подходящий словарь в атрибут *typemap* обработчика.422423#### `getMessageID(record)`424425Возвращает идентификатор сообщения для записи. Если используются собственные сообщения, можно передавать *msg* в логгер как идентификатор, а не как строку форматирования. Затем в этом методе можно выполнить поиск по словарю для получения идентификатора сообщения. Данная версия возвращает 1 – базовый идентификатор сообщения в `win32service.pyd`.426427## SMTPHandler428429Класс [`SMTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SMTPHandler), находящийся в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений логирования на адрес электронной почты через SMTP.430431#### `class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)`432433Возвращает новый экземпляр класса [`SMTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SMTPHandler). Экземпляр инициализируется адресами отправителя и получателя, а также темой письма. *toaddrs* должен быть списком строк. Для указания нестандартного SMTP-порта используйте кортеж (host, port) для аргумента *mailhost*. Если используется строка, применяется стандартный SMTP-порт. Если SMTP-сервер требует аутентификации, можно указать кортеж (username, password) для аргумента *credentials*.434435Чтобы указать использование защищённого протокола (TLS), передайте кортеж в аргумент *secure*. Он будет использоваться только при наличии учётных данных аутентификации. Кортеж должен быть либо пустым, либо содержать одно значение – имя файла ключа, либо два значения: имя файла ключа и сертификата. (Этот кортеж передаётся методу [`smtplib.SMTP.starttls()`](https://python-all.ru/3.8/library/smtplib.html#smtplib.SMTP.starttls).)436437Для взаимодействия с SMTP-сервером можно задать тайм-аут с помощью аргумента *timeout*.438439Новое в версии 3.3: Аргумент *timeout* был добавлен.440441#### `emit(record)`442443Форматирует запись и отправляет её указанным получателям.444445#### `getSubject(record)`446447Чтобы задать тему письма, зависящую от записи, переопределите этот метод.448449## MemoryHandler450451Класс [`MemoryHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.MemoryHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает буферизацию записей журнала в памяти с периодическим сбросом в целевой обработчик *target*. Сброс происходит, когда буфер заполнен или когда встречается событие указанного уровня важности или выше.452453[`MemoryHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.MemoryHandler) является подклассом более общего [`BufferingHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BufferingHandler), который является абстрактным классом. Он буферизует записи журнала в памяти. При добавлении каждой записи в буфер вызывается `shouldFlush()` для проверки необходимости сброса. Если сброс нужен, то `flush()` выполняет его.454455#### `class logging.handlers.BufferingHandler(capacity)`456457Инициализирует обработчик буфером указанной ёмкости. Здесь *capacity* означает количество буферизируемых записей журнала.458459#### `emit(record)`460461Добавляет запись в буфер. Если [`shouldFlush()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BufferingHandler.shouldFlush) возвращает true, вызывает [`flush()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.BufferingHandler.flush) для обработки буфера.462463#### `flush()`464465Вы можете переопределить этот метод, чтобы задать собственное поведение при сбросе. Текущая версия просто очищает буфер.466467#### `shouldFlush(record)`468469Возвращает `True`, если буфер заполнен. Этот метод можно переопределить для реализации собственных стратегий сброса.470471#### `class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True)`472473Возвращает новый экземпляр класса [`MemoryHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.MemoryHandler). Экземпляр инициализируется буфером размером *capacity* (количество буферизируемых записей). Если *flushLevel* не указан, используется `ERROR`. Если *target* не указан, целевой обработчик нужно задать с помощью [`setTarget()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.MemoryHandler.setTarget), прежде чем обработчик начнёт работать. Если *flushOnClose* задан как `False`, то буфер *не* сбрасывается при закрытии обработчика. Если не задан или задан как `True`, то при закрытии буфер сбрасывается, как и раньше.474475Изменено в версии 3.6: добавлен параметр *flushOnClose*.476477#### `close()`478479Вызывает [`flush()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.MemoryHandler.flush), устанавливает целевой обработчик в `None` и очищает буфер.480481#### `flush()`482483Для [`MemoryHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.MemoryHandler) сброс означает просто отправку буферизованных записей целевому объекту, если он задан. Буфер также очищается при этом. Переопределите, если требуется другое поведение.484485#### `setTarget(target)`486487Устанавливает целевой обработчик для данного обработчика.488489#### `shouldFlush(record)`490491Проверяет, заполнен ли буфер или поступила запись уровня *flushLevel* или выше.492493## HTTPHandler494495Класс [`HTTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.HTTPHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журнала на веб-сервер с использованием семантики `GET` или `POST`.496497#### `class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None)`498499Возвращает новый экземпляр класса [`HTTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.HTTPHandler). Параметр *host* может быть в формате `host:port`, если требуется указать конкретный номер порта. Если *method* не указан, используется `GET`. Если *secure* равен true, будет использоваться HTTPS-соединение. Параметр *context* можно задать как экземпляр [`ssl.SSLContext`](https://python-all.ru/3.8/library/ssl.html#ssl.SSLContext) для настройки параметров SSL, используемых для HTTPS-соединения. Если указаны *credentials*, это должен быть кортеж из двух элементов – идентификатора пользователя и пароля, которые будут помещены в HTTP-заголовок 'Authorization' с использованием базовой аутентификации. Если указываются учётные данные, также следует указать secure=True, чтобы идентификатор и пароль не передавались в открытом виде.500501Изменено в версии 3.5: добавлен параметр *context*.502503#### `mapLogRecord(record)`504505Возвращает словарь на основе `record`, который должен быть закодирован в URL-кодировку и отправлен на веб-сервер. Реализация по умолчанию просто возвращает `record.__dict__`. Этот метод можно переопределить, если, например, на веб-сервер нужно отправить только подмножество [`LogRecord`](https://python-all.ru/3.8/library/logging.html#logging.LogRecord), или если требуется более точная настройка того, что отправляется на сервер.506507#### `emit(record)`508509Отправляет запись на веб-сервер в виде словаря, закодированного в URL. Для преобразования записи в отправляемый словарь используется метод [`mapLogRecord()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.HTTPHandler.mapLogRecord).510511> **Примечание**512>513> Поскольку подготовка записи для отправки на веб-сервер не является обычной операцией форматирования, использование [`setFormatter()`](https://python-all.ru/3.8/library/logging.html#logging.Handler.setFormatter) для указания [`Formatter`](https://python-all.ru/3.8/library/logging.html#logging.Formatter) для [`HTTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.HTTPHandler) не даёт эффекта. Вместо вызова [`format()`](https://python-all.ru/3.8/library/logging.html#logging.Handler.format), этот обработчик вызывает [`mapLogRecord()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.HTTPHandler.mapLogRecord), а затем [`urllib.parse.urlencode()`](https://python-all.ru/3.8/library/urllib.parse.html#urllib.parse.urlencode) для кодирования словаря в форму, подходящую для отправки на веб-сервер.514515## QueueHandler516517Новое в версии 3.2.518519Класс [`QueueHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueHandler), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает отправку сообщений журналирования в очередь, например в очередь, реализованную в модулях [`queue`](https://python-all.ru/3.8/library/queue.html#module-queue) или [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing).520521Наряду с классом [`QueueListener`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener), [`QueueHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueHandler) можно использовать, чтобы позволить обработчикам выполнять свою работу в отдельном потоке, отличном от того, который занимается логированием. Это важно в веб-приложениях и других служебных приложениях, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, а любые потенциально медленные операции (такие как отправка электронной почты через [`SMTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SMTPHandler)) выполняются в отдельном потоке.522523#### `class logging.handlers.QueueHandler(queue)`524525Возвращает новый экземпляр класса [`QueueHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueHandler). Экземпляр инициализируется очередью для отправки сообщений. *очередь* может быть любым объектом, похожим на очередь; он используется как есть методом [`enqueue()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueHandler.enqueue), который должен знать, как отправлять в него сообщения. Очередь не *обязана* иметь API отслеживания задач, поэтому для *очередь* можно использовать экземпляры [`SimpleQueue`](https://python-all.ru/3.8/library/queue.html#queue.SimpleQueue).526527#### `emit(record)`528529Помещает в очередь результат подготовки LogRecord. В случае возникновения исключения (например, из-за заполнения ограниченной очереди) вызывается метод [`handleError()`](https://python-all.ru/3.8/library/logging.html#logging.Handler.handleError) для обработки ошибки. Это может привести к тому, что запись будет молча отброшена (если `logging.raiseExceptions` равно `False`) или сообщение будет выведено в `sys.stderr` (если `logging.raiseExceptions` равно `True`).530531#### `prepare(record)`532533Подготавливает запись для помещения в очередь. Объект, возвращаемый этим методом, помещается в очередь.534535Базовая реализация форматирует запись, чтобы объединить сообщение, аргументы и информацию об исключении, если они присутствуют. Она также удаляет из записи unpickleable элементы на месте.536537Этот метод можно переопределить, если требуется преобразовать запись в словарь или JSON-строку, или отправить изменённую копию записи, оставив оригинал нетронутым.538539#### `enqueue(record)`540541Помещает запись в очередь с помощью `put_nowait()`; этот метод можно переопределить, если требуется блокирующее поведение, тайм-аут или настраиваемая реализация очереди.542543## QueueListener544545Новое в версии 3.2.546547Класс [`QueueListener`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener), расположенный в модуле [`logging.handlers`](https://python-all.ru/3.8/library/logging.handlers.html#module-logging.handlers), поддерживает получение сообщений журналирования из очереди, например из очереди, реализованной в модулях [`queue`](https://python-all.ru/3.8/library/queue.html#module-queue) или [`multiprocessing`](https://python-all.ru/3.8/library/multiprocessing.html#module-multiprocessing). Сообщения принимаются из очереди во внутреннем потоке и передаются в том же потоке одному или нескольким обработчикам для обработки. Хотя [`QueueListener`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener) сам по себе не является обработчиком, он документирован здесь, потому что работает в тесной связке с [`QueueHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueHandler).548549Наряду с классом [`QueueHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueHandler), [`QueueListener`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener) можно использовать, чтобы позволить обработчикам выполнять свою работу в отдельном потоке, отличном от того, который занимается логированием. Это важно в веб-приложениях и других служебных приложениях, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, а любые потенциально медленные операции (такие как отправка электронной почты через [`SMTPHandler`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.SMTPHandler)) выполняются в отдельном потоке.550551#### `class logging.handlers.QueueListener(queue, *handlers, respect_handler_level=False)`552553Возвращает новый экземпляр класса [`QueueListener`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener). Экземпляр инициализируется очередью для отправки сообщений и списком обработчиков, которые будут обрабатывать записи, помещённые в очередь. Очередь может быть любым объектом, похожим на очередь; она передаётся как есть методу [`dequeue()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener.dequeue), который должен знать, как извлекать из неё сообщения. Очередь не *обязана* иметь API отслеживания задач (хотя он используется, если доступен), поэтому для *очередь* можно использовать экземпляры [`SimpleQueue`](https://python-all.ru/3.8/library/queue.html#queue.SimpleQueue).554555Если `respect_handler_level` равно `True`, при принятии решения о передаче сообщений обработчику учитывается его уровень (сравнивается с уровнем сообщения); в противном случае поведение такое же, как в предыдущих версиях Python – всегда передавать каждое сообщение каждому обработчику.556557Изменено в версии 3.5: Добавлен аргумент `respect_handler_level`.558559#### `dequeue(block)`560561Извлекает запись из очереди и возвращает её, опционально блокируя.562563Базовая реализация использует `get()`. Можно переопределить этот метод, если требуется использовать тайм-ауты или работать с нестандартными реализациями очереди.564565#### `prepare(record)`566567Подготавливает запись к обработке.568569Эта реализация просто возвращает переданную запись. Можно переопределить этот метод, если требуется выполнить какую-либо собственную маршалинг или манипуляцию записью перед передачей обработчикам.570571#### `handle(record)`572573Обрабатывает запись.574575Просто перебирает обработчики, передавая им запись на обработку. Реальный объект, передаваемый обработчикам, – это то, что возвращается из [`prepare()`](https://python-all.ru/3.8/library/logging.handlers.html#logging.handlers.QueueListener.prepare).576577#### `start()`578579Запускает прослушиватель.580581Запускает фоновый поток для отслеживания очереди на предмет LogRecords, которые нужно обработать.582583#### `stop()`584585Останавливает прослушиватель.586587Запрашивает завершение потока и затем ожидает его завершения. Обратите внимание: если не вызвать этот метод до завершения приложения, в очереди могут остаться некоторые записи, которые не будут обработаны.588589#### `enqueue_sentinel()`590591Записывает сигнальный элемент в очередь, чтобы сообщить прослушивателю о завершении. Эта реализация использует `put_nowait()`. Можно переопределить этот метод, если требуется использовать тайм-ауты или работать с нестандартными реализациями очереди.592593Новое в версии 3.3.594595> **См. также**596>597> **Модуль [`logging`](https://python-all.ru/3.8/library/logging.html#module-logging)**598>599> Справочник API для модуля logging.600>601> **Модуль [`logging.config`](https://python-all.ru/3.8/library/logging.config.html#module-logging.config)**602>603> API конфигурации для модуля logging.604