logging.md
1> **Источник:** https://python-all.ru/3.16/library/logging.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `logging` – Средство логирования для Python89**Исходный код:** [Lib/logging/\_\_init\_\_.py](https://python-all.ru/src/main/Lib/logging/__init__.py)1011Важно1213На этой странице содержится справочная информация по API. Обучающую информацию и обсуждение более сложных тем см. в1415- [Базовое руководство](https://python-all.ru/3.16/howto/logging.html#logging-basic-tutorial)16- [Продвинутое руководство](https://python-all.ru/3.16/howto/logging.html#logging-advanced-tutorial)17- [Поваренная книга по логированию](https://python-all.ru/3.16/howto/logging-cookbook.html#logging-cookbook)1819---2021Этот модуль определяет функции и классы, реализующие гибкую систему логирования событий для приложений и библиотек.2223Основное преимущество наличия API логирования, предоставляемого модулем стандартной библиотеки, заключается в том, что все модули Python могут участвовать в логировании, поэтому журнал вашего приложения может включать ваши собственные сообщения вместе с сообщениями от сторонних модулей.2425Вот простой пример идиоматического использования:2627```python28# myapp.py29import logging30import mylib31logger = logging.getLogger(__name__)3233def main():34 logging.basicConfig(filename='myapp.log', level=logging.INFO)35 logger.info('Started')36 mylib.do_something()37 logger.info('Finished')3839if __name__ == '__main__':40 main()41```4243```python44# mylib.py45import logging46logger = logging.getLogger(__name__)4748def do_something():49 logger.info('Doing something')50```5152Если вы запустите *myapp.py*, вы должны увидеть это в *myapp.log*:5354```text55INFO:__main__:Started56INFO:mylib:Doing something57INFO:__main__:Finished58```5960Ключевая особенность этого идиоматического использования заключается в том, что большая часть кода просто создаёт логгер на уровне модуля с помощью `getLogger(__name__)` и использует этот логгер для выполнения любого необходимого логирования. Это лаконично, но при этом даёт нижележащему коду возможность тонкой настройки при необходимости. Сообщения, записанные в логгер уровня модуля, пересылаются обработчикам логгеров в более высоких модулях, вплоть до самого верхнего логгера, известного как корневой логгер; такой подход называется иерархическим логированием.6162Чтобы логирование было полезным, его необходимо настроить: задать уровни и назначения для каждого логгера, возможно, изменить способ логирования в определённых модулях, часто на основе аргументов командной строки или конфигурации приложения. В большинстве случаев, как в примере выше, достаточно настроить только корневой логгер, поскольку все нижележащие логгеры уровня модуля в конечном счёте пересылают свои сообщения его обработчикам. [`basicConfig()`](https://python-all.ru/3.16/library/logging.html#logging.basicConfig) предоставляет быстрый способ настройки корневого логгера, подходящий для многих сценариев использования.6364Модуль предоставляет много функциональности и гибкости. Если вы не знакомы с логированием, лучший способ освоиться – просмотреть учебные пособия (**см. ссылки выше и справа**).6566Базовые классы, определённые в модуле, вместе с их атрибутами и методами, перечислены в разделах ниже.6768- Регистраторы предоставляют интерфейс, который напрямую используется кодом приложения.69- Обработчики отправляют записи журнала (созданные регистраторами) в соответствующее назначение.70- Фильтры предоставляют более детальный механизм для определения того, какие записи журнала выводить.71- Форматировщики определяют расположение записей журнала в конечном выводе.7273## Объекты Logger7475Логгеры имеют следующие атрибуты и методы. Обратите внимание, что логгеры *НИКОГДА* не должны создаваться напрямую, а всегда через функцию уровня модуля `logging.getLogger(name)`. Многократные вызовы [`getLogger()`](https://python-all.ru/3.16/library/logging.html#logging.getLogger) с одним и тем же именем всегда будут возвращать ссылку на один и тот же объект Logger.7677The `name` is potentially a period-separated hierarchical value, like `foo.bar.baz` (though it could also be just plain `foo`, for example). Loggers that are further down in the hierarchical list are children of loggers higher up in the list. For example, given a logger with a name of `foo`, loggers with names of `foo.bar`, `foo.bar.baz`, and `foo.bam` are all descendants of `foo`. In addition, all loggers are descendants of the root logger. The logger name hierarchy is analogous to the Python package hierarchy, and identical to it if you organise your loggers on a per-module basis using the recommended construction `logging.getLogger(__name__)`. That’s because in a module, `__name__` is the module’s name in the Python package namespace.7879#### `class logging.Logger`8081#### `name`8283Это имя логгера, то есть значение, которое было передано в [`getLogger()`](https://python-all.ru/3.16/library/logging.html#logging.getLogger) для получения логгера.8485> **Примечание**86>87> Этот атрибут следует считать доступным только для чтения.8889#### `level`9091Пороговое значение этого логгера, установленное методом [`setLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.setLevel).9293> **Примечание**94>95> Не устанавливайте этот атрибут напрямую – всегда используйте [`setLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.setLevel), который проверяет переданный уровень.9697#### `parent`9899Родительский логгер этого логгера. Он может измениться при последующем создании логгеров, расположенных выше в иерархии пространства имён.100101> **Примечание**102>103> Это значение следует рассматривать как доступное только для чтения.104105#### `propagate`106107Если этот атрибут истинен, события, записанные в этот логгер, будут передаваться обработчикам логгеров более высокого уровня (предков) в дополнение к любым обработчикам, прикреплённым к этому логгеру. Сообщения передаются напрямую обработчикам логгеров-предков – ни уровень, ни фильтры этих логгеров-предков не учитываются.108109Если это ложно, сообщения логирования не передаются обработчикам логгеров-предков.110111Поясним на примере: если атрибут propagate логгера с именем `A.B.C` истинен, любое событие, записанное в `A.B.C` через вызов метода, например `logging.getLogger('A.B.C').error(...)`, будет (при условии прохождения проверки уровня и фильтров этого логгера) последовательно передано всем обработчикам, прикреплённым к логгерам с именами `A.B`, `A` и корневому логгеру, после того как сначала будет передано обработчикам, прикреплённым к `A.B.C`. Если у любого логгера в цепочке `A.B.C`, `A.B`, `A` атрибут `propagate` установлен в false, то это последний логгер, обработчикам которого предлагается обработать событие, и распространение на этом прекращается.112113Конструктор устанавливает этот атрибут в `True`.114115> **Примечание**116>117> Если вы прикрепите обработчик к логгеру *и* к одному или нескольким его предкам, он может выдать одну и ту же запись несколько раз. В общем случае нет необходимости прикреплять обработчик к более чем одному логгеру – если прикрепить его к соответствующему логгеру, который находится выше всех в иерархии логгеров, то он будет видеть все события, записанные всеми дочерними логгерами, при условии, что их параметр propagate оставлен равным `True`. Обычная практика – прикреплять обработчики только к корневому логгеру и позволить распространению заботиться об остальном.118119#### `handlers`120121Список обработчиков, непосредственно прикреплённых к этому экземпляру логгера.122123> **Примечание**124>125> Этот атрибут следует считать доступным только для чтения; обычно он изменяется через методы [`addHandler()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.addHandler) и [`removeHandler()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.removeHandler), которые используют блокировки для обеспечения потокобезопасной работы.126127#### `disabled`128129Этот атрибут отключает обработку любых событий. В инициализаторе он устанавливается в `False` и изменяется только кодом настройки логирования.130131> **Примечание**132>133> Этот атрибут следует считать доступным только для чтения.134135#### `setLevel(level)`136137Устанавливает порог для этого регистратора на *уровень*. Сообщения лога, менее серьёзные, чем *уровень*, будут игнорироваться; сообщения с серьёзностью *уровень* или выше будут отправлены любым обработчиком, обслуживающим этот регистратор, если только уровень обработчика не был установлен на более высокое значение серьёзности, чем *уровень*.138139При создании регистратора уровень устанавливается в [`NOTSET`](https://python-all.ru/3.16/library/logging.html#logging.NOTSET) (что приводит к обработке всех сообщений, если регистратор является корневым, или к делегированию родительскому регистратору, если он не корневой). Обратите внимание, что корневой регистратор создаётся с уровнем [`WARNING`](https://python-all.ru/3.16/library/logging.html#logging.WARNING).140141Термин «делегирование родительскому регистратору» означает, что если у регистратора уровень NOTSET, то просматривается цепочка его регистраторов-предков, пока не будет найден предок с уровнем, отличным от NOTSET, или не будет достигнут корень.142143Если найден предок с уровнем, отличным от NOTSET, то его уровень считается действующим уровнем регистратора, с которого начался поиск предка, и используется для определения обработки события логирования.144145Если достигнут корень и его уровень NOTSET, то будут обработаны все сообщения. В противном случае уровень корня будет использоваться как действующий уровень.146147Список уровней см. в [Уровни логирования](https://python-all.ru/3.16/library/logging.html#levels).148149Изменено в версии 3.2: Параметр *уровень* теперь принимает строковое представление уровня, например 'INFO', вместо целочисленных констант, таких как [`INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO). Однако обратите внимание, что уровни внутри хранятся как целые числа, и такие методы, как [`getEffectiveLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.getEffectiveLevel) и [`isEnabledFor()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.isEnabledFor), будут возвращать/ожидать целые числа.150151#### `isEnabledFor(level)`152153Указывает, будет ли обработано сообщение с *уровнем* серьёзности этим регистратором. Этот метод сначала проверяет уровень модуля, заданный `logging.disable(level)`, а затем действующий уровень регистратора, определяемый [`getEffectiveLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.getEffectiveLevel).154155#### `getEffectiveLevel()`156157Указывает действующий уровень для этого регистратора. Если с помощью [`setLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.setLevel) было установлено значение, отличное от [`NOTSET`](https://python-all.ru/3.16/library/logging.html#logging.NOTSET), возвращается оно. В противном случае иерархия просматривается в сторону корня, пока не будет найдено значение, отличное от `NOTSET`, и возвращается оно. Возвращаемое значение – целое число, обычно одно из [`logging.DEBUG`](https://python-all.ru/3.16/library/logging.html#logging.DEBUG), [`logging.INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO) и т.д.158159#### `getChild(suffix)`160161Возвращает регистратор, который является потомком данного регистратора в соответствии с суффиксом. Таким образом, `logging.getLogger('abc').getChild('def.ghi')` вернёт тот же регистратор, что и `logging.getLogger('abc.def.ghi')`. Это удобный метод, полезный, когда родительский регистратор именуется, например, через `__name__`, а не литеральной строкой.162163Добавлено в версии 3.2.164165#### `getChildren()`166167Возвращает набор регистраторов, которые являются непосредственными дочерними элементами данного регистратора. Например, `logging.getLogger().getChildren()` может вернуть набор, содержащий регистраторы с именами `foo` и `bar`, но регистратор с именем `foo.bar` не будет включён в набор. Аналогично, `logging.getLogger('foo').getChildren()` может вернуть набор, включающий регистратор с именем `foo.bar`, но не включающий регистратор с именем `foo.bar.baz`.168169Добавлено в версии 3.12.170171#### `debug(msg, *args, **kwargs)`172173Регистрирует сообщение с уровнем [`DEBUG`](https://python-all.ru/3.16/library/logging.html#logging.DEBUG) в этом регистраторе. *сообщение* – это строка форматирования сообщения, а *аргументы* – аргументы, которые объединяются с *сообщение* с помощью оператора форматирования строк. (Обратите внимание, что это означает возможность использовать ключевые слова в строке форматирования вместе с одним словарным аргументом.) Если *аргументы* не указаны, операция форматирования % над *сообщение* не выполняется.174175В *kwargs* проверяются четыре именованных аргумента: *exc\_info*, *stack\_info*, *stacklevel* и *extra*.176177Если *exc\_info* не равно false, к сообщению лога добавляется информация об исключении. Если предоставлен кортеж исключения (в формате, возвращаемом [`sys.exc_info()`](https://python-all.ru/3.16/library/sys.html#sys.exc_info)) или экземпляр исключения, используется он; в противном случае вызывается `sys.exc_info()` для получения информации об исключении.178179Второй необязательный именованный аргумент – *stack\_info*, по умолчанию `False`. Если true, к сообщению лога добавляется информация о стеке, включая сам вызов логирования. Обратите внимание, что это не та же информация о стеке, что отображается при указании *exc\_info*: первая – это кадры стека от низа стека до вызова логирования в текущем потоке, тогда как вторая – информация о кадрах стека, которые были размотаны после исключения в процессе поиска обработчиков исключений.180181Можно указать *stack\_info* независимо от *exc\_info*, например, чтобы просто показать, как был достигнут определённый участок кода, даже если исключения не возникали. Кадры стека выводятся после строки заголовка, которая гласит:182183```text184Stack (most recent call last):185```186187Это имитирует `Traceback (most recent call last):`, используемый при отображении кадров исключения.188189Третий необязательный именованный аргумент – *stacklevel*, по умолчанию `1`. Если больше 1, при вычислении номера строки и имени функции, устанавливаемых в [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord), создаваемом для события логирования, пропускается соответствующее количество кадров стека. Это можно использовать во вспомогательных функциях логирования, чтобы записываемые имя функции, имя файла и номер строки относились не к вспомогательной функции/методу, а к её вызывающему. Имя этого параметра соответствует эквивалентному параметру в модуле [`warnings`](https://python-all.ru/3.16/library/warnings.html#module-warnings).190191Четвёртый именованный аргумент – *extra*, который можно использовать для передачи словаря, заполняющего [`__dict__`](https://python-all.ru/3.16/reference/datamodel.html#object.__dict__) объекта [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord), создаваемого для события логирования, пользовательскими атрибутами. Эти пользовательские атрибуты затем можно использовать по своему усмотрению. Например, их можно включить в регистрируемые сообщения. Например:192193```python194FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s'195logging.basicConfig(format=FORMAT)196d = {'clientip': '192.168.0.1', 'user': 'fbloggs'}197logger = logging.getLogger('tcpserver')198logger.warning('Protocol problem: %s', 'connection reset', extra=d)199```200201выведет что-то вроде202203```text2042006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset205```206207Ключи в словаре, переданном в *extra*, не должны конфликтовать с ключами, используемыми системой логирования. (Подробнее о том, какие ключи используются системой логирования, см. в разделе [Атрибуты LogRecord](https://python-all.ru/3.16/library/logging.html#logrecord-attributes).)208209Если решено использовать эти атрибуты в регистрируемых сообщениях, следует соблюдать осторожность. В приведённом выше примере, например, [`Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter) настроен со строкой форматирования, которая ожидает 'clientip' и 'user' в словаре атрибутов [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord). Если они отсутствуют, сообщение не будет записано, так как возникнет исключение форматирования строки. В этом случае необходимо всегда передавать словарь *extra* с этими ключами.210211Хотя это может раздражать, эта функция предназначена для использования в специализированных ситуациях, например, в многопоточных серверах, где один и тот же код выполняется во многих контекстах, а интересующие условия зависят от этого контекста (такие как IP-адрес удаленного клиента и имя аутентифицированного пользователя в приведенном выше примере). В таких обстоятельствах, скорее всего, специализированные [`Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter)s будут использоваться с определенными [`Handler`](https://python-all.ru/3.16/library/logging.html#logging.Handler)s.212213Если к этому логгеру (или любому из его предков, с учетом соответствующих атрибутов [`Logger.propagate`](https://python-all.ru/3.16/library/logging.html#logging.Logger.propagate)) не прикреплен обработчик, сообщение будет отправлено обработчику, установленному на [`lastResort`](https://python-all.ru/3.16/library/logging.html#logging.lastResort).214215Изменено в версии 3.2: Добавлен параметр *stack\_info*.216217Изменено в версии 3.5: Параметр *exc\_info* теперь может принимать экземпляры исключений.218219Изменено в версии 3.8: Добавлен параметр *stacklevel*.220221#### `info(msg, *args, **kwargs)`222223Записывает сообщение с уровнем [`INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO) в этот логгер. Аргументы интерпретируются так же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).224225#### `warning(msg, *args, **kwargs)`226227Записывает сообщение с уровнем [`WARNING`](https://python-all.ru/3.16/library/logging.html#logging.WARNING) в этот логгер. Аргументы интерпретируются так же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).228229> **Примечание**230>231> Существует устаревший метод `warn`, который функционально идентичен `warning`. Поскольку `warn` устарел, не используйте его – используйте `warning`.232233#### `error(msg, *args, **kwargs)`234235Записывает сообщение с уровнем [`ERROR`](https://python-all.ru/3.16/library/logging.html#logging.ERROR) в этот логгер. Аргументы интерпретируются так же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).236237#### `critical(msg, *args, **kwargs)`238239Записывает сообщение с уровнем [`CRITICAL`](https://python-all.ru/3.16/library/logging.html#logging.CRITICAL) в этот логгер. Аргументы интерпретируются так же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).240241#### `log(level, msg, *args, **kwargs)`242243Записывает сообщение с целочисленным уровнем *level* в этот логгер. Остальные аргументы интерпретируются так же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).244245#### `exception(msg, *args, **kwargs)`246247Записывает сообщение с уровнем [`ERROR`](https://python-all.ru/3.16/library/logging.html#logging.ERROR) в этот логгер. Аргументы интерпретируются так же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug). К сообщению добавляется информация об исключении. Этот метод следует вызывать только из обработчика исключений.248249#### `addFilter(filter)`250251Добавляет указанный фильтр *filter* к этому логгеру.252253#### `removeFilter(filter)`254255Удаляет указанный фильтр *filter* из этого логгера.256257#### `filter(record)`258259Применяет фильтры этого логгера к записи и возвращает `True`, если запись должна быть обработана. Фильтры опрашиваются по очереди, пока один из них не вернет ложное значение. Если ни один из них не вернул ложное значение, запись будет обработана (передана обработчикам). Если какой-либо фильтр вернул ложное значение, дальнейшая обработка записи не происходит.260261#### `addHandler(hdlr)`262263Добавляет указанный обработчик *hdlr* к этому логгеру.264265#### `removeHandler(hdlr)`266267Удаляет указанный обработчик *hdlr* из этого логгера.268269#### `findCaller(stack_info=False, stacklevel=1)`270271Находит исходное имя файла и номер строки вызывающего кода. Возвращает имя файла, номер строки, имя функции и информацию о стеке в виде кортежа из 4 элементов. Информация о стеке возвращается как `None`, если *stack\_info* не равно `True`.272273Параметр *stacklevel* передается из кода, вызывающего [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug) и другие API. Если он больше 1, избыток используется для пропуска кадров стека перед определением возвращаемых значений. Обычно это полезно при вызове API логирования из вспомогательного/оберточного кода, чтобы информация в журнале событий относилась не к вспомогательному/оберточному коду, а к коду, который его вызывает.274275#### `handle(record)`276277Обрабатывает запись, передавая её всем обработчикам, связанным с этим регистратором и его предками (пока не встретится ложное значение *propagate*). Этот метод используется для распакованных записей, полученных через сокет, а также для созданных локально. Фильтрация на уровне регистратора применяется с помощью [`filter()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.filter).278279#### `makeRecord(name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)`280281Это фабричный метод, который можно переопределить в подклассах для создания специализированных экземпляров [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord).282283#### `hasHandlers()`284285Проверяет, есть ли у этого регистратора настроенные обработчики. Это делается путём поиска обработчиков в этом регистраторе и его родителях в иерархии регистраторов. Возвращает `True`, если обработчик найден, иначе `False`. Метод прекращает поиск вверх по иерархии, как только будет найден регистратор, у которого атрибут 'propagate' установлен в false – это будет последний регистратор, проверяемый на наличие обработчиков.286287Добавлено в версии 3.2.288289Изменено в версии 3.7: Регистраторы теперь можно сериализовать и десериализовать с помощью пикл.290291## Уровни журналирования292293Числовые значения уровней журналирования приведены в следующей таблице. Они представляют интерес в первую очередь, если вы хотите определить собственные уровни и хотите, чтобы они имели определенные значения относительно предопределенных уровней. Если вы определяете уровень с тем же числовым значением, он перезаписывает предопределенное значение; предопределенное имя теряется.294295| Уровень | Числовое значение | Что это означает / Когда использовать |296| --- | --- | --- |297| logging.NOTSET | 0 | При установке на регистраторе означает, что для определения действующего уровня следует обращаться к вышестоящим регистраторам. Если в результате всё равно получается `NOTSET`, то регистрируются все события. При установке на обработчик обрабатываются все события. |298| logging.DEBUG | 10 | Подробная информация, обычно представляющая интерес только для разработчика, пытающегося диагностировать проблему. |299| logging.INFO | 20 | Подтверждение того, что всё работает как ожидается. |300| logging.WARNING | 30 | Указание на то, что произошло что-то неожиданное или что в ближайшем будущем может возникнуть проблема (например, «мало места на диске»). Программа по-прежнему работает как ожидается. |301| logging.ERROR | 40 | Из-за более серьёзной проблемы программа не смогла выполнить некоторую функцию. |302| logging.CRITICAL | 50 | Серьёзная ошибка, указывающая на то, что программа может быть не в состоянии продолжить работу. |303304## Объекты-обработчики305306Обработчики имеют следующие атрибуты и методы. Обратите внимание, что [`Handler`](https://python-all.ru/3.16/library/logging.html#logging.Handler) никогда не создаётся напрямую; этот класс служит базой для более полезных подклассов. Однако метод `__init__()` в подклассах должен вызывать [`Handler.__init__()`](https://python-all.ru/3.16/library/logging.html#logging.Handler.__init__).307308#### `class logging.Handler`309310#### `__init__(level=NOTSET)`311312Инициализирует экземпляр `Handler`, устанавливая его уровень, устанавливая список фильтров в пустой список и создавая блокировку (с помощью [`createLock()`](https://python-all.ru/3.16/library/logging.html#logging.Handler.createLock)) для сериализации доступа к механизму ввода-вывода.313314#### `createLock()`315316Инициализирует блокировку потока, которую можно использовать для сериализации доступа к нижележащей функциональности ввода-вывода, которая может не быть потокобезопасной.317318#### `acquire()`319320Захватывает блокировку потока, созданную с помощью [`createLock()`](https://python-all.ru/3.16/library/logging.html#logging.Handler.createLock).321322#### `release()`323324Освобождает блокировку потока, захваченную с помощью [`acquire()`](https://python-all.ru/3.16/library/logging.html#logging.Handler.acquire).325326#### `setLevel(level)`327328Устанавливает порог для этого обработчика в *level*. Сообщения журнала, которые менее серьёзны, чем *level*, будут игнорироваться. При создании обработчика уровень устанавливается в [`NOTSET`](https://python-all.ru/3.16/library/logging.html#logging.NOTSET) (что приводит к обработке всех сообщений).329330Список уровней см. в [Уровни логирования](https://python-all.ru/3.16/library/logging.html#levels).331332Изменено в версии 3.2: Параметр *level* теперь принимает строковое представление уровня, например 'INFO', как альтернативу целочисленным константам таким как [`INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO).333334#### `setFormatter(fmt)`335336Устанавливает для данного обработчика форматировщик *fmt*. Аргумент *fmt* должен быть экземпляром [`Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter) или `None`.337338#### `addFilter(filter)`339340Добавляет указанный фильтр *filter* к данному обработчику.341342#### `removeFilter(filter)`343344Удаляет указанный фильтр *filter* из данного обработчика.345346#### `filter(record)`347348Применяет фильтры данного обработчика к записи и возвращает `True`, если запись должна быть обработана. Фильтры опрашиваются по очереди, пока один из них не вернёт ложное значение. Если ни один не вернул ложного значения, запись будет выдана. Если какой-то возвращает ложное значение, обработчик не выдаёт запись.349350#### `flush()`351352Обеспечивает сброс всего вывода логирования. Данная версия ничего не делает и предназначена для реализации в подклассах.353354#### `close()`355356Освобождает все ресурсы, используемые обработчиком. Данная версия не производит вывод, но удаляет обработчик из внутреннего словаря обработчиков, который используется для поиска обработчика по имени.357358Подклассы должны гарантировать, что этот метод вызывается из переопределённых методов `close()`.359360#### `handle(record)`361362Условно выдает указанную запись логирования в зависимости от фильтров, которые могут быть добавлены к обработчику. Оборачивает фактическую выдачу записи в захват/освобождение блокировки потока ввода-вывода.363364#### `handleError(record)`365366Этот метод должен вызываться из обработчиков при возникновении исключения во время вызова [`emit()`](https://python-all.ru/3.16/library/logging.html#logging.Handler.emit). Если атрибут уровня модуля [`raiseExceptions`](https://python-all.ru/3.16/library/logging.html#logging.raiseExceptions) равен `False`, исключения молча игнорируются. Это обычно и нужно для системы логирования – большинство пользователей не заботятся об ошибках в системе логирования, их больше интересуют ошибки приложения. Однако при желании можно заменить этот метод собственным обработчиком. Указанная запись – та, что обрабатывалась в момент возникновения исключения. (Значение по умолчанию для `raiseExceptions` – `True`, так как это полезнее во время разработки.)367368#### `format(record)`369370Форматирует запись – если задан форматировщик, использует его. В противном случае использует форматировщик по умолчанию для модуля.371372#### `emit(record)`373374Делает всё необходимое для фактической записи указанной записи логирования. Эта версия предназначена для реализации в подклассах и поэтому возбуждает [`NotImplementedError`](https://python-all.ru/3.16/library/exceptions.html#NotImplementedError).375376> **Предупреждение**377>378> Этот метод вызывается после захвата блокировки уровня обработчика, которая освобождается после возврата из этого метода. При переопределении этого метода следует быть осторожным при вызове чего-либо, что обращается к другим частям API логирования, которые могут выполнять блокировку, так как это может привести к взаимной блокировке. В частности:379>380> - API конфигурации логирования захватывают блокировку уровня модуля, а затем индивидуальные блокировки уровня обработчика при настройке этих обработчиков.381> - Многие API логирования блокируют блокировку уровня модуля. Если такой API вызывается из этого метода, это может привести к взаимной блокировке, если вызов конфигурации производится в другом потоке, потому что этот поток будет пытаться захватить блокировку уровня модуля *до* блокировки уровня обработчика, тогда как данный поток пытается захватить блокировку уровня модуля *после* блокировки уровня обработчика (поскольку в этом методе блокировка уровня обработчика уже захвачена).382383Список стандартных обработчиков см. в [`logging.handlers`](https://python-all.ru/3.16/library/logging.handlers.html#module-logging.handlers).384385## Объекты Formatter386387#### `class logging.Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)`388389Отвечает за преобразование [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord) в выходную строку, предназначенную для чтения человеком или внешней системой.390391**Параметры:**392393- **fmt** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str)) – строка форматирования в заданном *style* для всего вывода лога в целом. Возможные ключи отображения берутся из [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord) объекта – [атрибутов LogRecord](https://python-all.ru/3.16/library/logging.html#logrecord-attributes). Если не указано, используется `'%(message)s'`, что равняется самому сообщению лога.394- **datefmt** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str)) – строка форматирования для части даты/времени вывода лога. Если не указано, используется значение по умолчанию, описанное в [`formatTime()`](https://python-all.ru/3.16/library/logging.html#logging.Formatter.formatTime).395- **style** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str)) – может быть одним из `'%'`, `'{'` или `'$'` и определяет, как строка форматирования будет объединяться с данными: с помощью одного из стилей: [printf-стиль форматирования строк](https://python-all.ru/3.16/library/stdtypes.html#old-string-formatting) (`%`), [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format) (`{`) или [`string.Template`](https://python-all.ru/3.16/library/string.html#string.Template) (`$`). Это относится только к *fmt* (например, `'%(message)s'` против `'{message}'`), а не к фактическим сообщениям лога, передаваемым в методы логирования. Однако существуют [другие способы](https://python-all.ru/3.16/howto/logging-cookbook.html#formatting-styles) использовать `{`- и `$`-форматирование для сообщений лога.396- **validate** ([*bool*](https://python-all.ru/3.16/library/functions.html#bool)) – Если `True` (по умолчанию), то неверные или несовпадающие *fmt* и *style* вызовут [`ValueError`](https://python-all.ru/3.16/library/exceptions.html#ValueError); например, `logging.Formatter('%(asctime)s - %(message)s', style='{')`.397- **defaults** ([*dict*](https://python-all.ru/3.16/library/stdtypes.html#dict)*\[*[*str*](https://python-all.ru/3.16/library/stdtypes.html#str)*,* [*Any*](https://python-all.ru/3.16/library/typing.html#typing.Any)*\]*) – Словарь со значениями по умолчанию для пользовательских полей. Например, `logging.Formatter('%(ip)s %(message)s', defaults={"ip": None})`398399Изменено в версии 3.2: Добавлен параметр *style*.400401Изменено в версии 3.8: Добавлен параметр *validate*.402403Изменено в версии 3.10: Добавлен параметр *defaults*.404405#### `format(record)`406407Словарь атрибутов записи используется как операнд для операции форматирования строки. Возвращает результирующую строку. Перед форматированием словаря выполняется несколько подготовительных шагов. Атрибут *message* записи вычисляется с помощью *msg* % *args*. Если строка форматирования содержит `'(asctime)'`, для форматирования времени события вызывается [`formatTime()`](https://python-all.ru/3.16/library/logging.html#logging.Formatter.formatTime). Если присутствует информация об исключении, она форматируется с помощью [`formatException()`](https://python-all.ru/3.16/library/logging.html#logging.Formatter.formatException) и добавляется к сообщению. Обратите внимание, что отформатированная информация об исключении кешируется в атрибуте *exc\_text*. Это полезно, поскольку информация об исключении может быть сериализована и передана по сети, но следует быть внимательным, если имеется более одного подкласса `Formatter`, которые настраивают форматирование информации об исключении. В этом случае необходимо очистить кешированное значение (установив атрибут *exc\_text* в `None`) после того, как форматтер выполнит своё форматирование, чтобы следующий форматтер, обрабатывающий событие, не использовал кешированное значение, а пересчитал его заново.408409Если доступна информация о стеке, она добавляется после информации об исключении с использованием [`formatStack()`](https://python-all.ru/3.16/library/logging.html#logging.Formatter.formatStack) для её преобразования, если необходимо.410411#### `formatTime(record, datefmt=None)`412413Этот метод должен вызываться из [`format()`](https://python-all.ru/3.16/library/functions.html#format) форматтером, который хочет использовать отформатированное время. Этот метод можно переопределить в форматтерах для удовлетворения любых конкретных требований, но базовое поведение следующее: если указан *datefmt* (строка), он используется с [`time.strftime()`](https://python-all.ru/3.16/library/time.html#time.strftime) для форматирования времени создания записи. В противном случае используется формат '%Y-%m-%d %H:%M:%S,uuu', где часть uuu – это значение в миллисекундах, а остальные буквы – согласно документации `time.strftime()`. Пример времени в этом формате: `2003-01-23 00:29:50,411`. Возвращается результирующая строка.414415Эта функция использует настраиваемую пользователем функцию для преобразования времени создания в кортеж. По умолчанию используется [`time.localtime()`](https://python-all.ru/3.16/library/time.html#time.localtime); чтобы изменить это для конкретного экземпляра форматтера, установите атрибут `converter` на функцию с той же сигнатурой, что и `time.localtime()` или [`time.gmtime()`](https://python-all.ru/3.16/library/time.html#time.gmtime). Чтобы изменить это для всех форматтеров, например, если вы хотите показывать все времена логирования в GMT, установите атрибут `converter` в классе `Formatter`.416417Изменено в версии 3.3: Ранее формат по умолчанию был жестко задан, как в этом примере: `2010-09-06 22:38:15,292`, где часть до запятой обрабатывается строкой формата strptime (`'%Y-%m-%d %H:%M:%S'`), а часть после запятой – значение в миллисекундах. Поскольку в strptime нет заполнителя для миллисекунд, значение в миллисекундах добавляется с помощью другой строки формата, `'%s,%03d'` – и обе эти строки формата были жестко закодированы в этом методе. С этим изменением данные строки определяются как атрибуты уровня класса, которые можно переопределить на уровне экземпляра при необходимости. Имена атрибутов: `default_time_format` (для строки формата strptime) и `default_msec_format` (для добавления значения в миллисекундах).418419Изменено в версии 3.9: `default_msec_format` может быть `None`.420421#### `formatException(exc_info)`422423Форматирует указанную информацию об исключении (стандартный кортеж исключения, возвращаемый [`sys.exc_info()`](https://python-all.ru/3.16/library/sys.html#sys.exc_info)) в строку. Эта реализация по умолчанию просто использует [`traceback.print_exception()`](https://python-all.ru/3.16/library/traceback.html#traceback.print_exception). Возвращается результирующая строка.424425#### `formatStack(stack_info)`426427Форматирует указанную информацию о стеке (строку, возвращаемую [`traceback.print_stack()`](https://python-all.ru/3.16/library/traceback.html#traceback.print_stack), но с удалённым последним символом новой строки) в строку. Эта реализация по умолчанию просто возвращает входное значение.428429#### `class logging.BufferingFormatter(linefmt=None)`430431Базовый класс форматтера, подходящий для создания подклассов, когда требуется отформатировать несколько записей. Можно передать экземпляр [`Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter), который будет использоваться для форматирования каждой строки (соответствующей одной записи). Если не указано, в качестве форматтера строк используется форматтер по умолчанию (который просто выводит сообщение события).432433#### `formatHeader(records)`434435Возвращает заголовок для списка *records*. Базовая реализация просто возвращает пустую строку. Этот метод нужно переопределить, если требуется определённое поведение, например, для отображения количества записей, заголовка или строки-разделителя.436437#### `formatFooter(records)`438439Возвращает нижний колонтитул для списка *records*. Базовая реализация просто возвращает пустую строку. Этот метод нужно переопределить, если требуется определённое поведение, например, для отображения количества записей или строки-разделителя.440441#### `format(records)`442443Возвращает отформатированный текст для списка *records*. Базовая реализация просто возвращает пустую строку, если нет записей; в противном случае возвращает объединение заголовка, каждой записи, отформатированной с помощью форматтера строк, и нижнего колонтитула.444445## Объекты фильтров446447`Filters` могут использоваться `Handlers` и `Loggers` для более сложной фильтрации, чем та, что обеспечивается уровнями. Базовый класс фильтра пропускает только события, которые находятся ниже определённой точки в иерархии логгеров. Например, фильтр, инициализированный строкой 'A.B', будет пропускать события, записанные логгерами 'A.B', 'A.B.C', 'A.B.C.D', 'A.B.D' и т.д., но не 'A.BB', 'B.A.B' и т.д. Если инициализирован пустой строкой, пропускаются все события.448449#### `class logging.Filter(name='')`450451Возвращает экземпляр класса `Filter`. Если указан *name*, он задаёт имя логгера, который вместе со своими потомками будет пропускать свои события через фильтр. Если *name* – пустая строка, пропускаются все события.452453#### `filter(record)`454455Должна ли указанная запись быть записана в журнал? Возвращает false для «нет», true для «да». Фильтры могут либо изменять записи журнала на месте, либо возвращать совершенно другой экземпляр записи, который заменит исходную запись журнала при любой последующей обработке события.456457Обратите внимание, что фильтры, прикреплённые к обработчикам, проверяются перед тем, как событие будет отправлено обработчиком, тогда как фильтры, прикреплённые к логгерам, проверяются всякий раз, когда событие регистрируется (с помощью [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug), [`info()`](https://python-all.ru/3.16/library/logging.html#logging.info) и т.д.), перед отправкой события обработчикам. Это означает, что события, созданные дочерними логгерами, не будут отфильтрованы настройкой фильтра логгера, если только фильтр не был также применён к этим дочерним логгерам.458459Не требуется создавать подкласс `Filter`: можно передать любой экземпляр, у которого есть метод `filter` с той же семантикой.460461Изменено в версии 3.2: Не требуется создавать специализированные классы `Filter` или использовать другие классы с методом `filter`: можно использовать функцию (или другой вызываемый объект) в качестве фильтра. Логика фильтрации проверяет, есть ли у объекта фильтра атрибут `filter`: если есть, считается, что это `Filter`, и вызывается его метод [`filter()`](https://python-all.ru/3.16/library/logging.html#logging.Filter.filter). В противном случае считается, что это вызываемый объект, и он вызывается с записью в качестве единственного параметра. Возвращаемое значение должно соответствовать тому, что возвращается `filter()`.462463Изменено в версии 3.12: Теперь можно возвращать экземпляр [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord) из фильтров, чтобы заменить запись журнала вместо её изменения на месте. Это позволяет фильтрам, прикреплённым к [`Handler`](https://python-all.ru/3.16/library/logging.html#logging.Handler), изменять запись журнала до её отправки, не оказывая побочного эффекта на другие обработчики.464465Хотя фильтры в первую очередь используются для фильтрации записей по более сложным критериям, чем уровни, они видят каждую запись, обрабатываемую обработчиком или регистратором, к которому они прикреплены: это может быть полезно, если нужно, например, подсчитать, сколько записей было обработано конкретным регистратором или обработчиком, или добавить, изменить или удалить атрибуты в обрабатываемом [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord). Очевидно, что изменение LogRecord требует осторожности, но это позволяет вставлять контекстную информацию в журналы (см. [Использование фильтров для добавления контекстной информации](https://python-all.ru/3.16/howto/logging-cookbook.html#filters-contextual)).466467## Объекты LogRecord468469Экземпляры [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord) создаются автоматически [`Logger`](https://python-all.ru/3.16/library/logging.html#logging.Logger) каждый раз, когда что-то регистрируется, и могут быть созданы вручную через [`makeLogRecord()`](https://python-all.ru/3.16/library/logging.html#logging.makeLogRecord) (например, из сериализованного события, полученного по сети).470471#### `class logging.LogRecord(name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)`472473Содержит всю информацию, относящуюся к регистрируемому событию.474475Основная информация передаётся в *msg* и *args*, которые объединяются с помощью `msg % args` для создания атрибута `message` записи.476477**Параметры:**478479- **name** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str)) – Имя регистратора, использованного для регистрации события, представленного этим `LogRecord`. Обратите внимание, что имя регистратора в `LogRecord` всегда будет иметь это значение, даже если оно может быть отправлено обработчиком, прикреплённым к другому (родительскому) регистратору.480- **level** ([*int*](https://python-all.ru/3.16/library/functions.html#int)) – [Числовой уровень](https://python-all.ru/3.16/library/logging.html#levels) события журналирования (например, `10` для `DEBUG`, `20` для `INFO` и т.д.). Обратите внимание, что он преобразуется в *два* атрибута LogRecord: `levelno` для числового значения и `levelname` для соответствующего имени уровня.481- **pathname** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str)) – Полный строковый путь к исходному файлу, из которого был сделан вызов журналирования.482- **lineno** ([*int*](https://python-all.ru/3.16/library/functions.html#int)) – Номер строки в исходном файле, из которой был сделан вызов журналирования.483- **msg** ([*Any*](https://python-all.ru/3.16/library/typing.html#typing.Any)) – Сообщение описания события, которое может быть строкой формата % с заполнителями для переменных данных или произвольным объектом (см. [Использование произвольных объектов в качестве сообщений](https://python-all.ru/3.16/howto/logging.html#arbitrary-object-messages)).484- **args** ([*tuple*](https://python-all.ru/3.16/library/stdtypes.html#tuple) *|* [*dict*](https://python-all.ru/3.16/library/stdtypes.html#dict)*\[*[*str*](https://python-all.ru/3.16/library/stdtypes.html#str)*,* [*Any*](https://python-all.ru/3.16/library/typing.html#typing.Any)*\]*) – Переменные данные для объединения с аргументом *msg* для получения описания события.485- **exc\_info** ([*tuple*](https://python-all.ru/3.16/library/stdtypes.html#tuple)*\[*[*type*](https://python-all.ru/3.16/library/functions.html#type)*\[*[*BaseException*](https://python-all.ru/3.16/library/exceptions.html#BaseException)*\]**,* *BaseException**,* [*types.TracebackType*](https://python-all.ru/3.16/library/types.html#types.TracebackType)*\]* *|* *None*) – Кортеж исключения с информацией о текущем исключении, возвращаемый [`sys.exc_info()`](https://python-all.ru/3.16/library/sys.html#sys.exc_info), или `None`, если информация об исключении отсутствует.486- **func** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str) *|* *None*) – Имя функции или метода, из которого был вызван вызов журналирования.487- **sinfo** ([*str*](https://python-all.ru/3.16/library/stdtypes.html#str) *|* *None*) – Текстовая строка, представляющая информацию о стеке от основания стека в текущем потоке до вызова журналирования.488489#### `getMessage()`490491Возвращает сообщение для этого экземпляра `LogRecord` после объединения любых аргументов, предоставленных пользователем, с сообщением. Если аргумент сообщения, предоставленный пользователем при вызове журналирования, не является строкой, для преобразования его в строку вызывается [`str()`](https://python-all.ru/3.16/library/stdtypes.html#str). Это позволяет использовать определённые пользователем классы в качестве сообщений, чей метод `__str__` может возвращать фактическую строку форматирования.492493Изменено в версии 3.2: Создание `LogRecord` стало более настраиваемым благодаря предоставлению фабрики, используемой для создания записи. Фабрику можно задать с помощью [`getLogRecordFactory()`](https://python-all.ru/3.16/library/logging.html#logging.getLogRecordFactory) и [`setLogRecordFactory()`](https://python-all.ru/3.16/library/logging.html#logging.setLogRecordFactory) (см. сигнатуру фабрики).494495Эта функциональность может быть использована для внедрения собственных значений в `LogRecord` во время создания. Можно использовать следующий шаблон:496497```python498old_factory = logging.getLogRecordFactory()499500def record_factory(*args, **kwargs):501 record = old_factory(*args, **kwargs)502 record.custom_attribute = 0xdecafbad503 return record504505logging.setLogRecordFactory(record_factory)506```507508При таком шаблоне можно объединять несколько фабрик, и пока они не перезаписывают атрибуты друг друга или случайно не перезаписывают стандартные атрибуты, перечисленные выше, сюрпризов быть не должно.509510## Атрибуты LogRecord511512LogRecord имеет ряд атрибутов, большинство из которых получены из параметров конструктора. (Обратите внимание, что имена не всегда точно соответствуют между параметрами конструктора LogRecord и атрибутами LogRecord.) Эти атрибуты можно использовать для объединения данных из записи в строку форматирования. В следующей таблице перечислены (в алфавитном порядке) имена атрибутов, их значения и соответствующий заполнитель в строке форматирования в стиле %.513514Если используется форматирование {} ([`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format)), можно использовать `{attrname}` в качестве заполнителя в строке форматирования. Если используется форматирование $ ([`string.Template`](https://python-all.ru/3.16/library/string.html#string.Template)), используйте форму `${attrname}`. В обоих случаях, конечно, замените `attrname` на фактическое имя атрибута.515516В случае форматирования {} можно указать флаги форматирования, поместив их после имени атрибута, отделив двоеточием. Например: заполнитель `{msecs:03.0f}` отформатирует значение миллисекунд `4` как `004`. Обратитесь к документации [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format) для получения полной информации о доступных параметрах.517518| Имя атрибута | Формат | Описание |519| --- | --- | --- |520| аргументы | Форматировать это самостоятельно не требуется. | Кортеж аргументов, объединяемых в `msg` для получения `message`, или словарь, значения которого используются для объединения (когда есть только один аргумент, и это словарь). |521| asctime | `%(asctime)s` | Время создания [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord) в удобочитаемом формате. По умолчанию оно имеет вид '2003-07-08 16:49:45,896' (цифры после запятой – миллисекундная часть времени). |522| created | `%(created)f` | Время создания [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord) (возвращается [`time.time_ns()`](https://python-all.ru/3.16/library/time.html#time.time_ns) / 1e9). |523| exc\_info | Форматировать это самостоятельно не требуется. | Кортеж с информацией об исключении (как в `sys.exc_info`) или `None`, если исключения не было. |524| exc\_text | Форматировать это самостоятельно не требуется. | Информация об исключении, отформатированная как строка. Задаётся при вызове [`Formatter.format()`](https://python-all.ru/3.16/library/logging.html#logging.Formatter.format) или `None`, если исключения не было. |525| filename | `%(filename)s` | Часть имени файла из `pathname`. |526| funcName | `%(funcName)s` | Имя функции, содержащей вызов логирования. |527| levelname | `%(levelname)s` | Текстовый уровень логирования для сообщения (`'DEBUG'`, `'INFO'`, `'WARNING'`, `'ERROR'`, `'CRITICAL'`). |528| levelno | `%(levelno)s` | Числовой уровень логирования для сообщения ([`DEBUG`](https://python-all.ru/3.16/library/logging.html#logging.DEBUG), [`INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO), [`WARNING`](https://python-all.ru/3.16/library/logging.html#logging.WARNING), [`ERROR`](https://python-all.ru/3.16/library/logging.html#logging.ERROR), [`CRITICAL`](https://python-all.ru/3.16/library/logging.html#logging.CRITICAL)). |529| lineno | `%(lineno)d` | Номер строки исходного кода, из которой был сделан вызов логирования (если доступен). |530| message | `%(message)s` | Журналируемое сообщение, вычисляемое как `msg % args`. Задаётся при вызове [`Formatter.format()`](https://python-all.ru/3.16/library/logging.html#logging.Formatter.format). |531| module | `%(module)s` | Модуль (часть имени из `filename`). |532| msecs | `%(msecs)d` | Миллисекундная часть времени создания [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord). |533| msg | Форматировать это самостоятельно не требуется. | Строка формата, переданная в исходном вызове логирования. Объединяется с `args` для получения `message`, или произвольный объект (см. [Использование произвольных объектов в качестве сообщений](https://python-all.ru/3.16/howto/logging.html#arbitrary-object-messages)). |534| имя | `%(name)s` | Имя регистратора, использованного для записи вызова. |535| pathname | `%(pathname)s` | Полный путь к исходному файлу, из которого был сделан вызов логирования (если доступен). |536| процесс | `%(process)d` | Идентификатор процесса (если доступен). |537| processName | `%(processName)s` | Имя процесса (если доступно). |538| relativeCreated | `%(relativeCreated)d` | Время в миллисекундах, когда LogRecord был создан, относительно времени загрузки модуля logging. |539| stack\_info | Форматировать это самостоятельно не требуется. | Информация о стековых фреймах (где доступна) от дна стека в текущем потоке до стекового фрейма включительно, соответствующего вызову логирования, который привёл к созданию этой записи. |540| поток | `%(thread)d` | Идентификатор потока (если доступен). |541| threadName | `%(threadName)s` | Имя потока (если доступно). |542| taskName | `%(taskName)s` | [`asyncio.Task`](https://python-all.ru/3.16/library/asyncio-task.html#asyncio.Task) имя (если доступно). |543544Изменено в версии 3.1: *processName* был добавлен.545546Изменено в версии 3.12: *taskName* был добавлен.547548## Объекты LoggerAdapter549550Экземпляры [`LoggerAdapter`](https://python-all.ru/3.16/library/logging.html#logging.LoggerAdapter) используются для удобной передачи контекстной информации в вызовы логирования. Пример использования см. в разделе [добавления контекстной информации в вывод логирования](https://python-all.ru/3.16/howto/logging-cookbook.html#context-info).551552#### `class logging.LoggerAdapter(logger, extra=None, merge_extra=False)`553554Возвращает экземпляр `LoggerAdapter`, инициализированный базовым экземпляром [`Logger`](https://python-all.ru/3.16/library/logging.html#logging.Logger), необязательным объектом, подобным словарю (*extra*), и необязательным булевым значением (*merge\_extra*), указывающим, следует ли объединять аргумент *extra* отдельных вызовов логирования с extra базового объекта `LoggerAdapter`. По умолчанию аргумент *extra* отдельных вызовов логирования игнорируется и используется только extra экземпляра `LoggerAdapter`555556#### `process(msg, kwargs)`557558Изменяет сообщение и/или именованные аргументы, переданные в вызов логирования, чтобы вставить контекстную информацию. Эта реализация берёт объект, переданный как *extra* конструктору, и добавляет его в *kwargs* с ключом 'extra'. Возвращаемое значение – кортеж (*msg*, *kwargs*), содержащий (возможно изменённые) версии переданных аргументов.559560#### `manager`561562Делегирует базовому `manager` объекта *logger*.563564#### `_log`565566Делегирует базовому методу `_log()` объекта *logger*.567568В дополнение к вышеперечисленному, `LoggerAdapter` поддерживает следующие методы [`Logger`](https://python-all.ru/3.16/library/logging.html#logging.Logger): [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.debug), [`info()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.info), [`warning()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.warning), [`error()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.error), [`exception()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.exception), [`critical()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.critical), [`log()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.log), [`isEnabledFor()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.isEnabledFor), [`getEffectiveLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.getEffectiveLevel), [`setLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.setLevel) и [`hasHandlers()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.hasHandlers). Эти методы имеют те же сигнатуры, что и их аналоги в `Logger`, поэтому можно использовать оба типа экземпляров взаимозаменяемо.569570Изменено в версии 3.2: Методы [`isEnabledFor()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.isEnabledFor), [`getEffectiveLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.getEffectiveLevel), [`setLevel()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.setLevel) и [`hasHandlers()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.hasHandlers) были добавлены в `LoggerAdapter`. Эти методы делегируют выполнение базовому логгеру.571572Изменено в версии 3.6: Добавлены атрибут `manager` и метод `_log()`, которые делегируют выполнение базовому логгеру и позволяют вкладывать адаптеры.573574Изменено в версии 3.10: Аргумент *extra* теперь необязателен.575576Изменено в версии 3.13: Добавлен параметр *merge\_extra*.577578## Потокобезопасность579580Модуль logging спроектирован как потокобезопасный без необходимости каких-либо специальных действий со стороны клиентов. Это достигается за счёт использования блокировок потоков: одна блокировка для сериализации доступа к общим данным модуля, и каждый обработчик также создаёт блокировку для сериализации доступа к своему базовому вводу-выводу.581582Если при реализации асинхронных обработчиков сигналов с помощью модуля [`signal`](https://python-all.ru/3.16/library/signal.html#module-signal) может оказаться, что использовать логирование внутри таких обработчиков невозможно. Это связано с тем, что реализации блокировок в модуле [`threading`](https://python-all.ru/3.16/library/threading.html#module-threading) не всегда реентерабельны и поэтому не могут быть вызваны из таких обработчиков сигналов.583584## Функции уровня модуля585586Помимо классов, описанных выше, существует ряд функций уровня модуля.587588#### `logging.getLogger(name=None)`589590Возвращает логгер с указанным именем; если name равно `None`, возвращает корневой логгер иерархии. Если имя указано, оно обычно представляет собой иерархическое имя, разделённое точками, например *'a'*, *'a.b'* или *'a.b.c.d'*. Выбор этих имен полностью лежит на разработчике, использующем логирование, хотя рекомендуется использовать `__name__`, если нет особых причин поступать иначе, как упоминается в [Объекты Logger](https://python-all.ru/3.16/library/logging.html#logger).591592Все вызовы этой функции с одним и тем же именем возвращают один и тот же экземпляр логгера. Это означает, что экземпляры логгера никогда не нужно передавать между различными частями приложения.593594#### `logging.getLoggerClass()`595596Возвращает либо стандартный класс [`Logger`](https://python-all.ru/3.16/library/logging.html#logging.Logger), либо последний класс, переданный в [`setLoggerClass()`](https://python-all.ru/3.16/library/logging.html#logging.setLoggerClass). Эту функцию можно вызывать из определения нового класса, чтобы гарантировать, что установка пользовательского класса `Logger` не отменит настройки, уже применённые другим кодом. Например:597598```python599class MyLogger(logging.getLoggerClass()):600 # ... переопределить поведение здесь601```602603#### `logging.getLogRecordFactory()`604605Возвращает вызываемый объект, который используется для создания [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord).606607Добавлено в версии 3.2: Эта функция была предоставлена вместе с [`setLogRecordFactory()`](https://python-all.ru/3.16/library/logging.html#logging.setLogRecordFactory), чтобы дать разработчикам больше контроля над тем, как конструируется [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord), представляющий событие логирования.608609См. [`setLogRecordFactory()`](https://python-all.ru/3.16/library/logging.html#logging.setLogRecordFactory) для получения дополнительной информации о том, как вызывается фабрика.610611#### `logging.debug(msg, *args, **kwargs)`612613Это вспомогательная функция, которая вызывает [`Logger.debug()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.debug) на корневом логгере. Обработка аргументов полностью идентична описанной в том методе.614615Единственное отличие в том, что если у корневого логгера нет обработчиков, то вызывается [`basicConfig()`](https://python-all.ru/3.16/library/logging.html#logging.basicConfig) перед вызовом `debug` на корневом логгере.616617Для очень коротких скриптов или быстрых демонстраций возможностей `logging` могут быть удобны `debug` и другие функции уровня модуля. Однако большинству программ требуется тщательный и явный контроль конфигурации логирования, поэтому предпочтительнее создавать логгер уровня модуля и вызывать на нём [`Logger.debug()`](https://python-all.ru/3.16/library/logging.html#logging.Logger.debug) (или другие методы для конкретных уровней), как описано в начале этой документации.618619#### `logging.info(msg, *args, **kwargs)`620621Записывает сообщение с уровнем [`INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO) на корневом логгере. В остальном аргументы и поведение такие же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).622623#### `logging.warning(msg, *args, **kwargs)`624625Записывает сообщение с уровнем [`WARNING`](https://python-all.ru/3.16/library/logging.html#logging.WARNING) на корневом логгере. В остальном аргументы и поведение такие же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).626627> **Примечание**628>629> Существует устаревшая функция `warn`, которая функционально идентична `warning`. Поскольку `warn` устарела, не используйте её – вместо неё используйте `warning`.630631#### `logging.error(msg, *args, **kwargs)`632633Записывает сообщение с уровнем [`ERROR`](https://python-all.ru/3.16/library/logging.html#logging.ERROR) на корневом логгере. В остальном аргументы и поведение такие же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).634635#### `logging.critical(msg, *args, **kwargs)`636637Записывает сообщение с уровнем [`CRITICAL`](https://python-all.ru/3.16/library/logging.html#logging.CRITICAL) на корневом логгере. В остальном аргументы и поведение такие же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).638639#### `logging.exception(msg, *args, **kwargs)`640641Записывает сообщение с уровнем [`ERROR`](https://python-all.ru/3.16/library/logging.html#logging.ERROR) на корневом логгере. В остальном аргументы и поведение такие же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug). К сообщению логирования добавляется информация об исключении. Эту функцию следует вызывать только из обработчика исключений.642643#### `logging.log(level, msg, *args, **kwargs)`644645Записывает сообщение с уровнем *level* на корневом логгере. В остальном аргументы и поведение такие же, как для [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug).646647#### `logging.disable(level=CRITICAL)`648649Предоставляет переопределяющий уровень *level* для всех логгеров, который имеет приоритет над собственным уровнем логгера. Эта функция может быть полезна, когда возникает необходимость временно снизить объём вывода логирования во всём приложении. Её действие заключается в отключении всех вызовов логирования с серьёзностью *level* и ниже, так что если вызвать её со значением INFO, то все события INFO и DEBUG будут отброшены, а события с серьёзностью WARNING и выше будут обрабатываться в соответствии с эффективным уровнем логгера. Если вызвать `logging.disable(logging.NOTSET)`, это переопределение уровня удаляется, и вывод логирования снова зависит от эффективных уровней отдельных логгеров.650651Обратите внимание: если вы определили какой-либо пользовательский уровень логирования выше `CRITICAL` (это не рекомендуется), вы не сможете полагаться на значение по умолчанию для параметра *level*, а придётся явно указать подходящее значение.652653Изменено в версии 3.7: Параметр *level* по умолчанию стал равен уровню `CRITICAL`. См. [bpo-28524](https://python-all.ru/3.16/library/logging.html) для получения дополнительной информации об этом изменении.654655#### `logging.addLevelName(level, levelName)`656657Связывает уровень *level* с текстом *levelName* во внутреннем словаре, который используется для преобразования числовых уровней в текстовое представление, например, когда [`Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter) форматирует сообщение. Эту функцию также можно использовать для определения собственных уровней. Единственные ограничения: все используемые уровни должны быть зарегистрированы с помощью этой функции, уровни должны быть положительными целыми числами и должны возрастать по степени серьезности.658659> **Примечание**660>661> Если вы планируете определять собственные уровни, обратитесь к разделу [Пользовательские уровни](https://python-all.ru/3.16/howto/logging.html#custom-levels).662663#### `logging.getLevelNamesMapping()`664665Возвращает отображение имён уровней на соответствующие уровни логирования. Например, строка «CRITICAL» сопоставляется с [`CRITICAL`](https://python-all.ru/3.16/library/logging.html#logging.CRITICAL). Возвращаемое отображение копируется из внутреннего отображения при каждом вызове этой функции.666667Добавлено в версии 3.12.668669#### `logging.getLevelName(level)`670671Возвращает текстовое или числовое представление уровня логирования *level*.672673Если *level* является одним из предопределённых уровней [`CRITICAL`](https://python-all.ru/3.16/library/logging.html#logging.CRITICAL), [`ERROR`](https://python-all.ru/3.16/library/logging.html#logging.ERROR), [`WARNING`](https://python-all.ru/3.16/library/logging.html#logging.WARNING), [`INFO`](https://python-all.ru/3.16/library/logging.html#logging.INFO) или [`DEBUG`](https://python-all.ru/3.16/library/logging.html#logging.DEBUG), то возвращается соответствующая строка. Если вы связали уровни с именами с помощью [`addLevelName()`](https://python-all.ru/3.16/library/logging.html#logging.addLevelName), то возвращается имя, которое вы связали с *level*. Если передано числовое значение, соответствующее одному из определённых уровней, возвращается соответствующее строковое представление.674675Параметр *level* также принимает строковое представление уровня, например «INFO». В таких случаях эта функция возвращает соответствующее числовое значение уровня.676677Если не передано ни подходящего числового, ни строкового значения, возвращается строка ‘Level %s’ % level.678679> **Примечание**680>681> Уровни внутри себя являются целыми числами (так как их нужно сравнивать в логике логирования). Эта функция используется для преобразования между целочисленным уровнем и именем уровня, отображаемым в форматированном выводе лога с помощью спецификатора формата `%(levelname)s` (см. [атрибуты LogRecord](https://python-all.ru/3.16/library/logging.html#logrecord-attributes)), и наоборот.682683Изменено в версии 3.4: В версиях Python до 3.4 этой функции также можно было передать текстовый уровень, и она возвращала соответствующее числовое значение уровня. Это недокументированное поведение считалось ошибкой и было удалено в Python 3.4, но восстановлено в 3.4.2 для сохранения обратной совместимости.684685#### `logging.getHandlerByName(name)`686687Возвращает обработчик с указанным *name* или `None`, если обработчика с таким именем нет.688689Добавлено в версии 3.12.690691#### `logging.getHandlerNames()`692693Возвращает неизменяемое множество всех известных имён обработчиков.694695Добавлено в версии 3.12.696697#### `logging.makeLogRecord(attrdict)`698699Создаёт и возвращает новый экземпляр [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord), атрибуты которого определяются *attrdict*. Эта функция полезна для получения сериализованного словаря атрибутов `LogRecord`, отправленного через сокет, и восстановления его в экземпляр `LogRecord` на принимающей стороне.700701#### `logging.basicConfig(**kwargs)`702703Выполняет базовую настройку системы логирования, создавая [`StreamHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.StreamHandler) с обработчиком [`Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter) по умолчанию или используя переданный экземпляр *formatter* и добавляя его в корневой логгер. Функции [`debug()`](https://python-all.ru/3.16/library/logging.html#logging.debug), [`info()`](https://python-all.ru/3.16/library/logging.html#logging.info), [`warning()`](https://python-all.ru/3.16/library/logging.html#logging.warning), [`error()`](https://python-all.ru/3.16/library/logging.html#logging.error) и [`critical()`](https://python-all.ru/3.16/library/logging.html#logging.critical) вызывают `basicConfig()` автоматически, если для корневого логгера не определено ни одного обработчика.704705Эта функция ничего не делает, если у корневого логгера уже настроены обработчики, если только аргумент ключевого слова *force* не установлен в `True`.706707> **Примечание**708>709> Эту функцию следует вызывать из главного потока до запуска других потоков. В версиях Python до 2.7.1 и 3.2, если эта функция вызывается из нескольких потоков, в редких случаях обработчик может быть добавлен в корневой логгер более одного раза, что приводит к неожиданным результатам, например, к дублированию сообщений в логе.710711Поддерживаются следующие аргументы ключевых слов.712713| Формат | Описание |714| --- | --- |715| *filename* | Указывает, что будет создан [`FileHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.FileHandler) с использованием указанного имени файла, а не [`StreamHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.StreamHandler). |716| *filemode* | Если указан *filename*, открыть файл в этом [режиме](https://python-all.ru/3.16/library/functions.html#filemodes). По умолчанию `'a'`. |717| *format* | Использовать указанную строку формата для обработчика. По умолчанию – атрибуты `levelname`, `name` и `message`, разделённые двоеточиями. |718| *datefmt* | Использовать указанный формат даты/времени, как принимается [`time.strftime()`](https://python-all.ru/3.16/library/time.html#time.strftime). |719| *стиль* | Если указан *format*, используйте этот стиль для строки форматирования. Допустимы значения `'%'`, `'{'` или `'$'` для [printf-стиля](https://python-all.ru/3.16/library/stdtypes.html#old-string-formatting), [`str.format()`](https://python-all.ru/3.16/library/stdtypes.html#str.format) или [`string.Template`](https://python-all.ru/3.16/library/string.html#string.Template) соответственно. По умолчанию `'%'`. |720| *уровень* | Устанавливает уровень корневого регистратора в указанный [уровень](https://python-all.ru/3.16/library/logging.html#levels). |721| *поток данных* | Использует указанный поток данных для инициализации [`StreamHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.StreamHandler). Обратите внимание, что этот аргумент несовместим с *имя файла* - если указаны оба, возбуждается `ValueError`. |722| *обработчики* | Если указано, это должна быть итерируемая последовательность уже созданных обработчиков для добавления в корневой регистратор. Любые обработчики, у которых ещё не установлен форматтер, получат форматтер по умолчанию, созданный в этой функции. Обратите внимание, что этот аргумент несовместим с *имя файла* или *поток данных* – если указаны оба, возбуждается `ValueError`. |723| *принудительно* | Если этот именованный аргумент указан как истина, все существующие обработчики, прикреплённые к корневому регистратору, удаляются и закрываются перед выполнением настройки, как указано другими аргументами. |724| *кодировка* | Если этот именованный аргумент указан вместе с *имя файла*, его значение используется при создании [`FileHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.FileHandler) и, таким образом, используется при открытии выходного файла. |725| *ошибки* | Если этот именованный аргумент указан вместе с *имя файла*, его значение используется при создании [`FileHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.FileHandler) и, таким образом, используется при открытии выходного файла. Если не указано, используется значение 'backslashreplace'. Обратите внимание, что если указан `None`, он будет передан как есть в [`open()`](https://python-all.ru/3.16/library/functions.html#open), что означает, что он будет обработан так же, как передача 'errors'. |726| *formatter* | Если указано, задаёт этот экземпляр formatter (см. [Объекты Formatter](https://python-all.ru/3.16/library/logging.html#formatter-objects)) для всех задействованных обработчиков. Если не указано, по умолчанию создаётся и используется экземпляр [`logging.Formatter`](https://python-all.ru/3.16/library/logging.html#logging.Formatter) на основе аргументов *format*, *datefmt* и *style*. Если *formatter* указан вместе с любым из трёх аргументов *format*, *datefmt* и *style*, возникает `ValueError`, сигнализирующий, что эти аргументы в противном случае потеряли бы смысл. |727728Изменено в версии 3.2: Был добавлен аргумент *стиль*.729730Изменено в версии 3.3: Был добавлен аргумент *обработчики*. Были добавлены дополнительные проверки для выявления ситуаций, когда указаны несовместимые аргументы (например, *обработчики* вместе с *поток данных* или *имя файла*, или *поток данных* вместе с *имя файла*).731732Изменено в версии 3.8: Был добавлен аргумент *принудительно*.733734Изменено в версии 3.9: Были добавлены аргументы *кодировка* и *ошибки*.735736Изменено в версии 3.15: Добавлен аргумент *formatter*.737738#### `logging.shutdown()`739740Сообщает системе логирования о необходимости выполнить упорядоченное завершение работы, сбрасывая и закрывая все обработчики. Эту функцию следует вызывать при завершении приложения, и после этого вызова не следует использовать систему логирования.741742При импорте модуля logging эта функция регистрируется как обработчик выхода (см. [`atexit`](https://python-all.ru/3.16/library/atexit.html#module-atexit)), поэтому обычно нет необходимости делать это вручную.743744#### `logging.setLoggerClass(klass)`745746Указывает системе логирования использовать класс *klass* при создании экземпляра регистратора. Класс должен определять `__init__()` таким образом, чтобы требовался только аргумент name, а `__init__()` должен вызывать `Logger.__init__()`. Эта функция обычно вызывается до создания каких-либо регистраторов приложениями, которым требуется нестандартное поведение регистратора. После этого вызова, как и в любое другое время, не создавайте регистраторы напрямую с помощью подкласса: продолжайте использовать API [`logging.getLogger()`](https://python-all.ru/3.16/library/logging.html#logging.getLogger) для получения регистраторов.747748#### `logging.setLogRecordFactory(factory)`749750Устанавливает вызываемый объект, используемый для создания [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord).751752**Параметры:**753754**factory** – вызываемый объект фабрики, используемый для создания записи журнала.755756Добавлено в версии 3.2: Эта функция предоставлена вместе с [`getLogRecordFactory()`](https://python-all.ru/3.16/library/logging.html#logging.getLogRecordFactory), чтобы позволить разработчикам лучше контролировать создание [`LogRecord`](https://python-all.ru/3.16/library/logging.html#logging.LogRecord), представляющего событие логирования.757758Фабрика имеет следующую сигнатуру:759760`factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)`761762> **name:**763>764> Имя регистратора.765>766> **level:**767>768> Уровень логирования (числовой).769>770> **fn:**771>772> Полный путь к файлу, в котором был выполнен вызов логирования.773>774> **lno:**775>776> Номер строки в файле, в котором был выполнен вызов логирования.777>778> **msg:**779>780> Сообщение логирования.781>782> **args:**783>784> Аргументы для сообщения логирования.785>786> **exc\_info:**787>788> Кортеж исключения или `None`.789>790> **func:**791>792> Имя функции или метода, из которого был сделан вызов логирования.793>794> **sinfo:**795>796> Трассировка стека, например, предоставляемая [`traceback.print_stack()`](https://python-all.ru/3.16/library/traceback.html#traceback.print_stack), показывающая иерархию вызовов.797>798> **kwargs:**799>800> Дополнительные именованные аргументы.801802## Атрибуты уровня модуля803804#### `logging.lastResort`805806«Обработчик последней надежды» доступен через этот атрибут. Он представляет собой [`StreamHandler`](https://python-all.ru/3.16/library/logging.handlers.html#logging.StreamHandler), который пишет в `sys.stderr` с уровнем `WARNING` и используется для обработки событий логирования при отсутствии какой-либо конфигурации логирования. В результате сообщение просто выводится в `sys.stderr`. Это заменяет более раннее сообщение об ошибке, гласившее, «для регистратора XYZ не найдено обработчиков». Если по какой-то причине нужно вернуть прежнее поведение, `lastResort` можно установить в `None`.807808Добавлено в версии 3.2.809810#### `logging.raiseExceptions`811812Позволяет определить, нужно ли распространять исключения, возникающие во время обработки.813814По умолчанию: `True`.815816Если `raiseExceptions` имеет значение `False`, исключения молча игнорируются. Это именно то, что в большинстве случаев нужно для системы логирования – большинству пользователей нет дела до ошибок в системе логирования, их больше интересуют ошибки приложения.817818## Интеграция с модулем warnings819820Функция [`captureWarnings()`](https://python-all.ru/3.16/library/logging.html#logging.captureWarnings) может использоваться для интеграции `logging` с модулем [`warnings`](https://python-all.ru/3.16/library/warnings.html#module-warnings).821822#### `logging.captureWarnings(capture)`823824Эта функция используется для включения и выключения перехвата предупреждений системой логирования.825826Если *capture* имеет значение `True`, предупреждения, выдаваемые модулем [`warnings`](https://python-all.ru/3.16/library/warnings.html#module-warnings), будут перенаправляться в систему логирования. В частности, предупреждение будет отформатировано с помощью [`warnings.formatwarning()`](https://python-all.ru/3.16/library/warnings.html#warnings.formatwarning), и результирующая строка будет записана в регистратор с именем `'py.warnings'` с уровнем серьезности [`WARNING`](https://python-all.ru/3.16/library/logging.html#logging.WARNING).827828Если *capture* имеет значение `False`, перенаправление предупреждений в систему логирования прекратится, и предупреждения будут направляться по своим исходным адресатам (т.е. тем, которые действовали до вызова `captureWarnings(True)`).829830> **См. также**831>832> **Модуль [`logging.config`](https://python-all.ru/3.16/library/logging.config.html#module-logging.config)**833>834> API конфигурации для модуля logging.835>836> **Модуль [`logging.handlers`](https://python-all.ru/3.16/library/logging.handlers.html#module-logging.handlers)**837>838> Полезные обработчики, входящие в состав модуля logging.839>840> **[**PEP 282**](https://python-all.ru/3.16/library/logging.html) – Система логирования**841>842> Предложение, описывающее эту возможность для включения в стандартную библиотеку Python.843>844> **[Оригинальный пакет логирования Python](https://python-all.ru/3.16/library/logging.html)**845>846> Это исходный код пакета `logging`. Версия пакета, доступная на этом сайте, подходит для использования с Python 1.5.2, 2.1.x и 2.2.x, в которых пакет `logging` не входит в стандартную библиотеку.847