logging
— Средства протоколирования для Python¶
Источник: Lib/logging/__init__.py
Этот модуль определяет функции и классы, которые реализуют гибкую систему регистрации событий для приложений и библиотек.
Основное преимущество того, что API протоколирования предоставляется стандартным библиотечным модулем, заключается в том, что все модули Python могут участвовать в протоколировании, поэтому журнал вашего приложения может содержать ваши собственные сообщения, интегрированные с сообщениями от сторонних модулей.
Вот простой пример идиоматического употребления:
# myapp.py
import logging
import mylib
logger = logging.getLogger(__name__)
def main():
logging.basicConfig(filename='myapp.log', level=logging.INFO)
logger.info('Started')
mylib.do_something()
logger.info('Finished')
if __name__ == '__main__':
main()
# mylib.py
import logging
logger = logging.getLogger(__name__)
def do_something():
logger.info('Doing something')
Если вы запустите myapp.py, вы должны увидеть это в myapp.log:
INFO:__main__:Started
INFO:mylib:Doing something
INFO:__main__:Finished
Ключевая особенность этого идиоматического использования заключается в том, что большая часть кода просто создает логгер уровня модуля с getLogger(__name__)
и использует его для выполнения всех необходимых операций по ведению журнала. Это лаконично, но при этом позволяет последующему коду осуществлять тонкий контроль, если это необходимо. Зарегистрированные сообщения в логгер уровня модуля передаются обработчикам логгеров в модулях более высокого уровня, вплоть до самого высокоуровневого логгера, известного как корневой логгер; такой подход известен как иерархическое протоколирование.
Чтобы логирование было полезным, его нужно настроить: задать уровни и места назначения для каждого логгера, потенциально изменить способ логирования определенных модулей, часто на основе аргументов командной строки или конфигурации приложения. В большинстве случаев, как и в приведенном выше случае, настраивать нужно только корневой логгер, поскольку все логгеры нижнего уровня на уровне модулей в конечном итоге передают свои сообщения его обработчикам. basicConfig()
предоставляет быстрый способ настройки корневого логгера, который подходит для многих случаев использования.
Модуль обладает широкой функциональностью и гибкостью. Если вы не знакомы с протоколированием, лучший способ освоить его - просмотреть учебные пособия (см. ссылки выше и справа).
Основные классы, определенные модулем, а также их атрибуты и методы перечислены в следующих разделах.
Логгеры открывают интерфейс, который непосредственно используется кодом приложения.
Обработчики отправляют записи журнала (созданные регистраторами) по назначению.
Фильтры обеспечивают более тонкую настройку для определения того, какие записи журнала следует выводить.
Форматировщики определяют расположение записей журнала в конечном выводе.
Объекты регистратора¶
Логгеры имеют следующие атрибуты и методы. Обратите внимание, что логгеры НИКОГДА не должны инстанцироваться напрямую, а всегда через функцию уровня модуля logging.getLogger(name)
. Многократные вызовы getLogger()
с одним и тем же именем всегда будут возвращать ссылку на один и тот же объект Logger.
Потенциально name
- это иерархическое значение, разделенное периодами, например foo.bar.baz
(хотя это может быть и просто foo
, например). Логгеры, расположенные ниже в иерархическом списке, являются дочерними по отношению к логгерам, расположенным выше в списке. Например, если взять логгер с именем foo
, то логгеры с именами foo.bar
, foo.bar.baz
и foo.bam
являются потомками foo
. Кроме того, все регистраторы являются потомками корневого регистратора. Иерархия имен логгеров аналогична иерархии пакетов Python и идентична ей, если вы организуете свои логгеры на основе модулей, используя рекомендуемую конструкцию logging.getLogger(__name__)
. Это потому, что в модуле __name__
- это имя модуля в пространстве имен пакета Python.
- class logging.Logger¶
- name¶
Это имя регистратора и значение, которое было передано в
getLogger()
для получения регистратора.Примечание
Этот атрибут должен рассматриваться как доступный только для чтения.
- level¶
Порог этого регистратора, установленный методом
setLevel()
.Примечание
Не устанавливайте этот атрибут напрямую - всегда используйте
setLevel()
, который проверяет переданный ему уровень.
- parent¶
Родительский логгер этого логгера. Он может меняться в зависимости от последующих инстанций регистраторов, которые находятся выше в иерархии пространства имен.
Примечание
Это значение должно рассматриваться как доступное только для чтения.
- propagate¶
Если этот атрибут имеет значение true, то события, зарегистрированные в этом логгере, будут переданы обработчикам логгеров более высокого уровня (предков), в дополнение к любым обработчикам, привязанным к этому логгеру. Сообщения передаются непосредственно в обработчики регистраторов-предков - ни уровень, ни фильтры регистраторов-предков не учитываются.
Если эта оценка равна false, сообщения журнала не передаются в обработчики предшествующих регистраторов.
Разъясним это на примере: Если атрибут propagate логгера с именем
A.B.C
имеет значение true, то любое событие, зарегистрированное вA.B.C
через вызов метода, напримерlogging.getLogger('A.B.C').error(...)
, будет [при условии передачи уровня и настроек фильтра этого логгера] передано по очереди всем обработчикам, прикрепленным к логгерам с именамиA.B
,A
и корневому логгеру, после того как сначала будет передано всем обработчикам, прикрепленным кA.B.C
. Если у любого логгера в цепочкеA.B.C
,A.B
,A
атрибутpropagate
установлен в false, то это последний логгер, чьим обработчикам предлагается обработать событие, и распространение прекращается в этой точке.Конструктор устанавливает этот атрибут в значение
True
.Примечание
Если прикрепить обработчик к логгеру и одному или нескольким его предкам, он может выдать одну и ту же запись несколько раз. В общем случае не нужно прикреплять обработчик к нескольким регистраторам - если вы просто прикрепите его к соответствующему регистратору, который находится выше всех в иерархии регистраторов, то он будет видеть все события, регистрируемые всеми потомками регистраторов, при условии, что их параметр propagate установлен в
True
. Обычный сценарий - прикреплять обработчики только к корневому логгеру, а об остальном пусть позаботится распространение.
- handlers¶
Список обработчиков, непосредственно связанных с данным экземпляром регистратора.
Примечание
Этот атрибут следует рассматривать как доступный только для чтения; обычно он изменяется с помощью методов
addHandler()
иremoveHandler()
, которые используют блокировки для обеспечения потокобезопасной работы.
- disabled¶
Этот атрибут отключает обработку любых событий. Он устанавливается в
False
в инициализаторе и изменяется только кодом конфигурации журнала.Примечание
Этот атрибут должен рассматриваться как доступный только для чтения.
- setLevel(level)¶
Устанавливает порог для этого регистратора на level. Сообщения журнала, которые менее серьезны, чем level, будут игнорироваться; сообщения журнала, которые имеют серьезность level или выше, будут выдаваться обработчиком или обработчиками, обслуживающими этот регистратор, если только уровень обработчика не был установлен на более высокий уровень серьезности, чем level.
При создании логгера его уровень устанавливается на
NOTSET
(что приводит к обработке всех сообщений, если логгер является корневым, или к делегированию родительскому, если логгер является некорневым). Обратите внимание, что корневой регистратор создается с уровнемWARNING
.Термин «делегирование родительскому» означает, что если регистратор имеет уровень NOTSET, то цепочка его предков-регистраторов обходится до тех пор, пока либо не будет найден предок с уровнем, отличным от NOTSET, либо не будет достигнут корень.
Если найден предок с уровнем, отличным от NOTSET, то уровень этого предка рассматривается как эффективный уровень регистратора, с которого начался поиск предка, и используется для определения того, как обрабатывается событие регистрации.
Если корень достигнут и его уровень равен NOTSET, то все сообщения будут обработаны. В противном случае в качестве эффективного уровня будет использоваться уровень корня.
Список уровней см. в разделе Уровни ведения журнала.
Изменено в версии 3.2: Параметр level теперь принимает строковое представление уровня, например „INFO“, в качестве альтернативы целочисленным константам, таким как
INFO
. Обратите внимание, однако, что уровни внутренне хранятся как целые числа, и такие методы, как, например,getEffectiveLevel()
иisEnabledFor()
, будут возвращать/ожидать, что им будут переданы целые числа.
- isEnabledFor(level)¶
Указывает, будет ли сообщение с уровнем серьезности level обработано этим регистратором. Этот метод проверяет сначала уровень уровня модуля, заданный
logging.disable(level)
, а затем эффективный уровень регистратора, определенныйgetEffectiveLevel()
.
- getEffectiveLevel()¶
Указывает эффективный уровень для данного регистратора. Если значение, отличное от
NOTSET
, было задано с помощьюsetLevel()
, оно возвращается. В противном случае иерархия обходится по направлению к корню, пока не будет найдено значение, отличное отNOTSET
, и это значение возвращается. Возвращаемое значение - целое число, обычно одно изlogging.DEBUG
,logging.INFO
и т. д.
- getChild(suffix)¶
Возвращает регистратор, который является потомком данного регистратора, что определяется суффиксом. Таким образом,
logging.getLogger('abc').getChild('def.ghi')
вернет тот же логгер, что иlogging.getLogger('abc.def.ghi')
. Это удобный метод, полезный, когда родительский логгер назван, например, с помощью__name__
, а не буквальной строки.Added in version 3.2.
- getChildren()¶
Возвращает набор логгеров, которые являются непосредственными дочерними элементами данного логгера. Так, например,
logging.getLogger().getChildren()
может вернуть набор, содержащий логгеры с именамиfoo
иbar
, но логгер с именемfoo.bar
не будет включен в этот набор. Аналогично,logging.getLogger('foo').getChildren()
может вернуть набор, включающий логгер с именемfoo.bar
, но не включающий логгер с именемfoo.bar.baz
.Added in version 3.12.
- debug(msg, *args, **kwargs)¶
Записывает сообщение с уровнем
DEBUG
в этот логгер. msg - это строка формата сообщения, а args - аргументы, которые объединяются в msg с помощью оператора форматирования строки. (Обратите внимание, что это означает, что вы можете использовать ключевые слова в строке формата вместе с одним аргументом из словаря). Операция форматирования % не выполняется над msg, если не указаны args.В kwargs есть четыре ключевых аргумента, которые проверяются: exc_info, stack_info, stacklevel и extra.
Если значение exc_info не равно false, это приводит к добавлению информации об исключении в сообщение журнализации. Если предоставлен кортеж исключений (в формате, возвращаемом
sys.exc_info()
) или экземпляр исключения, он используется; в противном случае для получения информации об исключении вызываетсяsys.exc_info()
.Вторым необязательным ключевым аргументом является stack_info, которое по умолчанию равно
False
. Если значение равно true, в сообщение логирования добавляется информация о стеке, включая фактический вызов логирования. Обратите внимание, что это не та же информация о стеке, что отображается при указании exc_info: Первая - это кадры стека от нижней части стека до вызова логирования в текущем потоке, а вторая - это информация о кадрах стека, которые были развернуты после исключения при поиске обработчиков исключений.Вы можете указать stack_info независимо от exc_info, например, чтобы просто показать, как вы дошли до определенной точки в коде, даже если исключения не были подняты. Кадры стека выводятся после строки заголовка, в которой говорится:
Stack (most recent call last):
Это имитирует
Traceback (most recent call last):
, который используется при отображении кадров исключений.Третьим необязательным ключевым аргументом является stacklevel, которое по умолчанию равно
1
. Если он больше 1, то соответствующее количество кадров стека пропускается при вычислении номера строки и имени функции, заданных вLogRecord
, созданном для события протоколирования. Это может быть использовано в помощниках протоколирования, чтобы имя функции, имя файла и номер строки записывались не для функции/метода помощника, а для его вызывающего. Имя этого параметра повторяет эквивалентное имя в модулеwarnings
.Четвертый ключевой аргумент - extra, который можно использовать для передачи словаря, используемого для заполнения __диктанта__
LogRecord
, созданного для события протоколирования, атрибутами, определенными пользователем. Эти пользовательские атрибуты можно использовать по своему усмотрению. Например, они могут быть включены в сообщения журнала. Например:FORMAT = '%(asctime)s %(clientip)-15s %(user)-8s %(message)s' logging.basicConfig(format=FORMAT) d = {'clientip': '192.168.0.1', 'user': 'fbloggs'} logger = logging.getLogger('tcpserver') logger.warning('Protocol problem: %s', 'connection reset', extra=d)
выведет что-то вроде
2006-02-08 22:20:02,165 192.168.0.1 fbloggs Protocol problem: connection reset
Ключи в словаре, передаваемые в extra, не должны пересекаться с ключами, используемыми системой протоколирования. (Дополнительную информацию о том, какие ключи используются системой протоколирования, см. в разделе Атрибуты LogRecord).
Если вы решите использовать эти атрибуты в сообщениях журнала, вам следует проявить некоторую осторожность. Например, в приведенном выше примере для
Formatter
была задана строка формата, которая ожидает наличия „clientip“ и „user“ в словаре атрибутовLogRecord
. Если они отсутствуют, сообщение не будет зарегистрировано, поскольку произойдет исключение форматирования строки. Поэтому в этом случае всегда нужно передавать дополнительный словарь с этими ключами.Хотя это может раздражать, данная возможность предназначена для использования в особых обстоятельствах, таких как многопоточные серверы, где один и тот же код выполняется во многих контекстах, а возникающие интересные условия зависят от этого контекста (например, IP-адрес удаленного клиента и аутентифицированное имя пользователя, в приведенном выше примере). В таких обстоятельствах вполне вероятно, что специализированные
Formatter
s будут использоваться с определеннымиHandler
s.Если к этому регистратору (или любому из его предков, учитывая соответствующие атрибуты
Logger.propagate
) не прикреплен обработчик, сообщение будет отправлено обработчику, установленному наlastResort
.Изменено в версии 3.2: Добавлен параметр stack_info.
Изменено в версии 3.5: Параметр exc_info теперь может принимать экземпляры исключений.
Изменено в версии 3.8: Добавлен параметр stacklevel.
Изменено в версии 3.13: Удалите недокументированный метод
warn()
, который был псевдонимом методаwarning()
.
- info(msg, *args, **kwargs)¶
Записывает в журнал сообщение с уровнем
INFO
на этом регистраторе. Аргументы интерпретируются как дляdebug()
.
- warning(msg, *args, **kwargs)¶
Записывает в журнал сообщение с уровнем
WARNING
на этом регистраторе. Аргументы интерпретируются как дляdebug()
.
- error(msg, *args, **kwargs)¶
Записывает в журнал сообщение с уровнем
ERROR
на этом регистраторе. Аргументы интерпретируются как дляdebug()
.
- critical(msg, *args, **kwargs)¶
Записывает в журнал сообщение с уровнем
CRITICAL
на этом регистраторе. Аргументы интерпретируются как дляdebug()
.
- log(level, msg, *args, **kwargs)¶
Записывает сообщение с целочисленным уровнем level в этот логгер. Остальные аргументы интерпретируются как для
debug()
.
- exception(msg, *args, **kwargs)¶
Записывает в журнал сообщение с уровнем
ERROR
на этом регистраторе. Аргументы интерпретируются как дляdebug()
. Информация об исключении добавляется в сообщение логера. Этот метод следует вызывать только из обработчика исключений.
- addFilter(filter)¶
Добавляет указанный фильтр filter к этому регистратору.
- removeFilter(filter)¶
Удаляет указанный фильтр filter из этого регистратора.
- filter(record)¶
Примените фильтры этого регистратора к записи и верните
True
, если запись должна быть обработана. Фильтры обращаются к записи по очереди, пока один из них не вернет ложное значение. Если ни один из них не вернет ложное значение, запись будет обработана (передана обработчикам). Если один из них возвращает ложное значение, дальнейшая обработка записи не производится.
- addHandler(hdlr)¶
Добавляет указанный обработчик hdlr к этому регистратору.
- removeHandler(hdlr)¶
Удаляет указанный обработчик hdlr из этого регистратора.
- findCaller(stack_info=False, stacklevel=1)¶
Находит имя и номер строки исходного файла вызывающей программы. Возвращает имя файла, номер строки, имя функции и информацию о стеке в виде кортежа из 4 элементов. Информация о стеке возвращается в виде
None
, если значение stack_info не равноTrue
.Параметр stacklevel передается из кода, вызывающего
debug()
и другие API. Если он больше 1, превышение используется для пропуска кадров стека перед определением возвращаемых значений. Обычно это полезно при вызове API протоколирования из вспомогательного/оберточного кода, чтобы информация в журнале событий относилась не к вспомогательному/оберточному коду, а к коду, который его вызывает.
- handle(record)¶
Обрабатывает запись, передавая ее всем обработчикам, связанным с этим регистратором и его предками (пока не будет найдено ложное значение propagate). Этот метод используется для непикированных записей, полученных из сокета, а также для записей, созданных локально. Фильтрация на уровне логгера применяется с помощью
filter()
.
- makeRecord(name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)¶
Это фабричный метод, который может быть переопределен в подклассах для создания специализированных экземпляров
LogRecord
.
- hasHandlers()¶
Проверяет, есть ли у этого регистратора настроенные обработчики. Это делается путем поиска обработчиков в данном логгере и его родителях в иерархии логгеров. Возвращает
True
, если обработчик был найден, иначеFalse
. Метод прекращает поиск по иерархии, если найден логгер с атрибутом „propagate“, установленным в false - это будет последний логгер, который проверяется на наличие обработчиков.Added in version 3.2.
Изменено в версии 3.7: Теперь лесорубы могут быть маринованными и не маринованными.
Уровни ведения журнала¶
Числовые значения уровней протоколирования приведены в следующей таблице. Они представляют интерес прежде всего в том случае, если вы хотите определить собственные уровни и хотите, чтобы они имели конкретные значения по сравнению с предопределенными уровнями. Если вы определяете уровень с таким же числовым значением, оно заменяет предопределенное значение; предопределенное имя теряется.
Уровень |
Числовое значение |
Что он означает / Когда его использовать |
---|---|---|
|
0 |
При установке для регистратора указывает, что для определения эффективного уровня необходимо обратиться к регистраторам-предшественникам. Если он по-прежнему равен |
|
10 |
Подробная информация, обычно представляющая интерес только для разработчика, пытающегося диагностировать проблему. |
|
20 |
Подтверждение того, что все работает так, как ожидалось. |
|
30 |
Признак того, что произошло что-то непредвиденное или что проблема может возникнуть в ближайшем будущем (например, «мало места на диске»). Программное обеспечение продолжает работать, как и ожидалось. |
|
40 |
Из-за более серьезной проблемы программное обеспечение не смогло выполнить какую-то функцию. |
|
50 |
Серьезная ошибка, указывающая на то, что сама программа может быть не в состоянии продолжать работу. |
Объекты обработчика¶
Обработчики имеют следующие атрибуты и методы. Обратите внимание, что Handler
никогда не инстанцируется напрямую; этот класс выступает в качестве базы для более полезных подклассов. Однако метод __init__()
в подклассах должен вызывать Handler.__init__()
.
- class logging.Handler¶
- __init__(level=NOTSET)¶
Инициализирует экземпляр
Handler
, устанавливая его уровень, устанавливая список фильтров в пустой список и создавая блокировку (используяcreateLock()
) для сериализации доступа к механизму ввода-вывода.
- createLock()¶
Инициализирует блокировку потока, которая может быть использована для сериализации доступа к базовой функциональности ввода-вывода, которая может быть небезопасна для потоков.
- acquire()¶
Приобретает блокировку потока, созданную с помощью
createLock()
.
- setLevel(level)¶
Устанавливает порог для этого обработчика на level. Сообщения в журнале, которые менее серьезны, чем уровень, будут игнорироваться. При создании обработчика уровень устанавливается в
NOTSET
(что приводит к обработке всех сообщений).Список уровней см. в разделе Уровни ведения журнала.
Изменено в версии 3.2: Параметр level теперь принимает строковое представление уровня, например „INFO“, в качестве альтернативы целочисленным константам, таким как
INFO
.
- addFilter(filter)¶
Добавляет указанный фильтр filter к этому обработчику.
- removeFilter(filter)¶
Удаляет указанный фильтр filter из этого обработчика.
- filter(record)¶
Примените фильтры этого обработчика к записи и верните
True
, если запись должна быть обработана. Фильтры обращаются к записи по очереди, пока один из них не вернет ложное значение. Если ни один из них не вернет ложное значение, запись будет выдана. Если один из них вернет ложное значение, обработчик не будет выдавать запись.
- flush()¶
Убедитесь, что все выводимые логи были удалены. Эта версия ничего не делает и предназначена для реализации подклассами.
- close()¶
Очистите все ресурсы, используемые обработчиком. Эта версия не делает никакого вывода, но удаляет обработчик из внутреннего списка обработчиков, который закрывается при вызове
shutdown()
. Подклассы должны убедиться, что эта функция вызывается из переопределенных методовclose()
.
- handle(record)¶
Условно испускает указанную запись в журнале, в зависимости от фильтров, которые могли быть добавлены в обработчик. Оборачивает фактическое испускание записи с получением/освобождением блокировки потока ввода/вывода.
- handleError(record)¶
Этот метод должен вызываться из обработчиков при возникновении исключения во время вызова
emit()
. Если атрибут уровня модуляraiseExceptions
равенFalse
, исключения будут молча игнорироваться. Это то, что в основном нужно для системы протоколирования - большинство пользователей не будут заботиться об ошибках в системе протоколирования, их больше интересуют ошибки приложения. Однако при желании вы можете заменить это на собственный обработчик. Указанная запись - это та, которая обрабатывалась в момент возникновения исключения. (По умолчанию дляraiseExceptions
используется значениеTrue
, так как это более удобно во время разработки).
- format(record)¶
Выполнить форматирование записи - если установлен форматтер, используйте его. В противном случае используется форматер по умолчанию для модуля.
- emit(record)¶
Делает все, что требуется для фактической регистрации указанной записи в журнале. Эта версия предназначена для реализации подклассами и поэтому вызывает ошибку
NotImplementedError
.Предупреждение
Этот метод вызывается после получения блокировки на уровне обработчика, которая снимается после возврата этого метода. Если вы переопределите этот метод, обратите внимание, что следует быть осторожным при вызове всего, что вызывает другие части API протоколирования, которые могут выполнять блокировку, поскольку это может привести к тупиковой ситуации. В частности:
API конфигурации протоколирования получают блокировку на уровне модуля, а затем блокировки на уровне отдельных обработчиков по мере их конфигурирования.
Многие API протоколирования блокируют блокировку на уровне модуля. Если такой API вызывается из этого метода, это может привести к тупиковой ситуации, если вызов конфигурации выполняется в другом потоке, поскольку этот поток будет пытаться получить блокировку уровня модуля до блокировки уровня обработчика, в то время как этот поток пытается получить блокировку уровня модуля после блокировки уровня обработчика (поскольку в этом методе блокировка уровня обработчика уже была получена).
Список обработчиков, входящих в стандартную поставку, см. в разделе logging.handlers
.
Объекты форматера¶
- class logging.Formatter(fmt=None, datefmt=None, style='%', validate=True, *, defaults=None)¶
Отвечает за преобразование
LogRecord
в выходную строку для интерпретации человеком или внешней системой.- Параметры:
fmt (str) – Строка формата в заданном стиле для вывода журнала в целом. Возможные ключи отображения берутся из
LogRecord
объекта Атрибуты LogRecord. Если ключ не указан, используется'%(message)s'
, который представляет собой просто сообщение в журнале.datefmt (str) – Строка формата в заданном стиле для части даты/времени в журнале. Если не указано, используется значение по умолчанию, описанное в
formatTime()
.style (str) – Может быть одним из
'%'
,'{'
или'$'
и определяет, как строка формата будет объединена с данными: с помощью одного из Форматирование строк в стиле printf (%
),str.format()
({
) илиstring.Template
($
). Это относится только к fmt и datefmt (например,'%(message)s'
против'{message}'
), а не к фактическим сообщениям журнала, передаваемым методам логирования. Однако есть other ways для использования{
- и$
-форматирования сообщений журнала.validate (bool) – Если
True
(по умолчанию), то неправильные или несовпадающие fmt и style вызовут ошибкуValueError
; например,logging.Formatter('%(asctime)s - %(message)s', style='{')
.defaults (dict[str, Any]) – Словарь со значениями по умолчанию для использования в пользовательских полях. Например,
logging.Formatter('%(ip)s %(message)s', defaults={"ip": None})
Изменено в версии 3.2: Добавлен параметр style.
Изменено в версии 3.8: Добавлен параметр validate.
Изменено в версии 3.10: Добавлен параметр defaults.
- format(record)¶
Словарь атрибутов записи используется в качестве операнда для операции форматирования строки. Возвращает результирующую строку. Перед форматированием словаря выполняется несколько подготовительных шагов. Атрибут message записи вычисляется с помощью msg % args. Если строка форматирования содержит
'(asctime)'
, вызываетсяformatTime()
для форматирования времени события. Если есть информация об исключении, она форматируется с помощьюformatException()
и добавляется к сообщению. Обратите внимание, что отформатированная информация об исключениях кэшируется в атрибуте exc_text. Это полезно, так как информация об исключениях может быть забракована и отправлена по проводам, но вы должны быть осторожны, если у вас есть более одного подклассаFormatter
, который настраивает форматирование информации об исключениях. В этом случае вам придется очистить кэшированное значение (установив атрибут exc_text в значениеNone
) после того, как форматтер выполнит свое форматирование, чтобы следующий форматтер, обрабатывающий событие, не использовал кэшированное значение, а пересчитал его заново.Если информация о стеке доступна, она добавляется после информации об исключении, используя
formatStack()
для ее преобразования, если это необходимо.
- formatTime(record, datefmt=None)¶
Этот метод должен вызываться из
format()
форматером, который хочет использовать отформатированное время. Этот метод может быть переопределен в форматерах, чтобы обеспечить любые специфические требования, но основное поведение следующее: если указано datefmt (строка), оно используется сtime.strftime()
для форматирования времени создания записи. В противном случае используется формат „%Y-%m-%d %H:%M:%S,uuu“, где часть uuu - это значение миллисекунды, а остальные буквы - согласно документацииtime.strftime()
. Пример времени в этом формате -2003-01-23 00:29:50,411
. Возвращается результирующая строка.Эта функция использует настраиваемую пользователем функцию для преобразования времени создания в кортеж. По умолчанию используется
time.localtime()
; чтобы изменить это для конкретного экземпляра форматера, установите атрибутconverter
в функцию с той же сигнатурой, что иtime.localtime()
илиtime.gmtime()
. Чтобы изменить этот параметр для всех форматеров, например, если вы хотите, чтобы все время регистрации отображалось в GMT, установите атрибутconverter
в классеFormatter
.Изменено в версии 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
(для добавления значения миллисекунды).Изменено в версии 3.9: Значение
default_msec_format
может бытьNone
.
- formatException(exc_info)¶
Формирует указанную информацию об исключении (стандартный кортеж исключений, возвращаемый
sys.exc_info()
) в виде строки. В данной реализации по умолчанию используется толькоtraceback.print_exception()
. Возвращается результирующая строка.
- formatStack(stack_info)¶
Форматирует указанную информацию о стеке (строку, возвращаемую командой
traceback.print_stack()
, но с удаленной последней новой строкой) в виде строки. Эта реализация по умолчанию просто возвращает входное значение.
- class logging.BufferingFormatter(linefmt=None)¶
Базовый класс форматера, который можно использовать в качестве подкласса, когда требуется отформатировать несколько записей. Вы можете передать экземпляр
Formatter
, который вы хотите использовать для форматирования каждой строки (что соответствует одной записи). Если он не указан, в качестве форматировщика строк используется форматировщик по умолчанию (который просто выводит сообщение о событии).- formatHeader(records)¶
Возвращает заголовок для списка записей. Базовая реализация просто возвращает пустую строку. Вам нужно переопределить этот метод, если вам нужно определенное поведение, например, чтобы показать количество записей, заголовок или разделительную строку.
Возвращает колонтитул для списка записей. Базовая реализация просто возвращает пустую строку. Вам нужно переопределить этот метод, если вам нужно определенное поведение, например, показать количество записей или разделительную строку.
- format(records)¶
Возвращает форматированный текст для списка записей. Базовая реализация возвращает пустую строку, если записей нет; в противном случае возвращается конкатенация заголовка, каждой записи, отформатированной с помощью строчного форматера, и нижнего колонтитула.
Фильтр объектов¶
Filters
может использоваться Handlers
и Loggers
для более сложной фильтрации, чем та, которая обеспечивается уровнями. Базовый класс фильтра разрешает только те события, которые находятся ниже определенной точки в иерархии регистраторов. Например, фильтр, инициализированный значением „A.B“, будет разрешать события, зарегистрированные логгерами „A.B“, „A.B.C“, „A.B.C.D“, „A.B.D“ и т. д., но не „A.BB“, „B.A.B“ и т. д. Если инициализировать пустой строкой, все события будут переданы.
- class logging.Filter(name='')¶
Возвращает экземпляр класса
Filter
. Если указано name, то это имя регистратора, события которого, вместе с его дочерними элементами, будут разрешены через фильтр. Если name - пустая строка, разрешается любое событие.- filter(record)¶
Должна ли указанная запись быть занесена в журнал? Возвращает false в случае «нет», true в случае «да». Фильтры могут либо изменять записи журнала на месте, либо возвращать совершенно другой экземпляр записи, который заменит исходную запись журнала при любой последующей обработке события.
Обратите внимание, что фильтры, прикрепленные к обработчикам, проверяются до того, как событие будет выдано обработчиком, в то время как фильтры, прикрепленные к логгерам, проверяются всякий раз, когда событие регистрируется (с помощью debug()
, info()
и т. д.), перед отправкой события обработчикам. Это означает, что события, которые были сгенерированы потомками регистраторов, не будут отфильтрованы настройками фильтра регистратора, если только фильтр не был применен и к этим потомкам регистраторов.
На самом деле вам не нужно создавать подкласс Filter
: вы можете передать любой экземпляр, у которого есть метод filter
с той же семантикой.
Изменено в версии 3.2: Вам не нужно создавать специализированные классы Filter
или использовать другие классы с методом filter
: вы можете использовать функцию (или другой вызываемый объект) в качестве фильтра. Логика фильтрации проверит, есть ли у объекта фильтра атрибут filter
: если есть, то он будет считаться Filter
и будет вызван его метод filter()
. В противном случае он принимается за вызываемый и вызывается с записью в качестве единственного параметра. Возвращаемое значение должно соответствовать значению, возвращаемому методом filter()
.
Изменено в версии 3.12: Теперь фильтры могут возвращать экземпляр LogRecord
, чтобы заменить запись журнала, а не модифицировать ее на месте. Это позволяет фильтрам, присоединенным к Handler
, изменять запись журнала перед ее выдачей, не оказывая побочных эффектов на другие обработчики.
Хотя фильтры используются в основном для фильтрации записей по более сложным критериям, чем уровни, они видят каждую запись, которая обрабатывается обработчиком или логгером, к которому они присоединены: это может быть полезно, если вы хотите подсчитать, сколько записей было обработано определенным логгером или обработчиком, или добавить, изменить или удалить атрибуты в обрабатываемой LogRecord
. Очевидно, что изменять LogRecord нужно с некоторой осторожностью, но это позволяет вводить в журналы контекстную информацию (см. Использование фильтров для передачи контекстной информации).
Объекты LogRecord¶
Экземпляры LogRecord
создаются автоматически Logger
каждый раз, когда что-то регистрируется, и могут быть созданы вручную с помощью makeLogRecord()
(например, из травленого события, полученного по проводу).
- class logging.LogRecord(name, level, pathname, lineno, msg, args, exc_info, func=None, sinfo=None)¶
Содержит всю информацию, относящуюся к регистрируемому событию.
Первичная информация передается в msg и args, которые объединяются с помощью
msg % args
для создания атрибутаmessage
записи.- Параметры:
name (str) – Имя регистратора, используемого для регистрации события, представленного этим
LogRecord
. Обратите внимание, что имя регистратора вLogRecord
всегда будет иметь это значение, даже если оно может быть выдано обработчиком, прикрепленным к другому (предковому) регистратору.level (int) – numeric level события регистрации (например,
10
дляDEBUG
,20
дляINFO
и т. д.). Обратите внимание, что это преобразуется в два атрибута записи LogRecord:levelno
для числового значения иlevelname
для соответствующего имени уровня.pathname (str) – Полный строковый путь к исходному файлу, в котором был выполнен вызов журнализации.
lineno (int) – Номер строки в исходном файле, в которой был сделан вызов журнализации.
msg (Any) – Сообщение описания события, которое может быть %-форматной строкой с заполнителями для переменных данных или произвольным объектом (см. Использование произвольных объектов в качестве сообщений).
args (tuple | dict[str, Any]) – Переменные данные для объединения с аргументом msg для получения описания события.
exc_info (tuple[type[BaseException], BaseException, types.TracebackType] | None) – Кортеж исключений с текущей информацией об исключениях, возвращаемой
sys.exc_info()
, илиNone
, если информация об исключениях недоступна.func (str | None) – Имя функции или метода, из которого был вызван вызов протоколирования.
sinfo (str | None) – Текстовая строка, представляющая информацию о стеке, начиная с основания стека в текущем потоке и заканчивая вызовом регистрации.
- getMessage()¶
Возвращает сообщение для данного экземпляра
LogRecord
после объединения с ним всех аргументов, предоставленных пользователем. Если пользовательский аргумент сообщения в вызове регистрации не является строкой, вызывается методstr()
для преобразования его в строку. Это позволяет использовать в качестве сообщений классы, определяемые пользователем, метод__str__
которых может возвращать фактическую строку формата, которая будет использоваться.
Изменено в версии 3.2: Создание
LogRecord
стало более настраиваемым благодаря предоставлению фабрики, которая используется для создания записи. Фабрика может быть задана с помощьюgetLogRecordFactory()
иsetLogRecordFactory()
(см. здесь подпись фабрики).Эта функциональность может быть использована для введения собственных значений в
LogRecord
во время создания. Вы можете использовать следующий шаблон:old_factory = logging.getLogRecordFactory() def record_factory(*args, **kwargs): record = old_factory(*args, **kwargs) record.custom_attribute = 0xdecafbad return record logging.setLogRecordFactory(record_factory)
С помощью этого шаблона можно объединить несколько фабрик в цепочку, и пока они не перезаписывают атрибуты друг друга или не переписывают стандартные атрибуты, перечисленные выше, никаких сюрпризов быть не должно.
Атрибуты LogRecord¶
У записи LogRecord есть несколько атрибутов, большинство из которых получены из параметров конструктора. (Обратите внимание, что имена не всегда точно совпадают между параметрами конструктора LogRecord и атрибутами LogRecord). Эти атрибуты можно использовать для объединения данных из записи в строку формата. В следующей таблице перечислены (в алфавитном порядке) имена атрибутов, их значения и соответствующее место в строке формата в стиле %.
Если вы используете {}-форматирование (str.format()
), вы можете использовать {attrname}
в качестве заполнителя в строке формата. Если вы используете $-форматирование (string.Template
), используйте форму ${attrname}
. В обоих случаях, конечно, замените attrname
на реальное имя атрибута, которое вы хотите использовать.
В случае {}-форматирования вы можете указать флаги форматирования, поместив их после имени атрибута, отделив от него двоеточием. Например, если поставить флаг {msecs:03.0f}
, то значение миллисекунды 4
будет отформатировано как 004
. Подробные сведения о доступных опциях см. в документации по str.format()
.
Имя атрибута |
Формат |
Описание |
---|---|---|
args |
Вам не придется форматировать его самостоятельно. |
Кортеж аргументов, объединенных в |
asctime |
|
Время создания |
создан |
|
Время, когда был создан |
exc_info |
Вам не придется форматировать его самостоятельно. |
Кортеж исключений (а-ля |
имя файла |
|
Часть имени файла |
funcName |
|
Имя функции, содержащей вызов регистрации. |
имя уровня |
|
Уровень регистрации текста сообщения ( |
уровень нет |
|
Числовой уровень регистрации сообщения ( |
lineno |
|
Номер исходной строки, на которой был сделан вызов регистрации (если доступно). |
сообщение |
|
Сообщение в журнале, вычисляемое как |
модуль |
|
Модуль (часть имени из |
мсек |
|
Миллисекундная часть времени, когда был создан |
msg |
Вам не придется форматировать его самостоятельно. |
Строка формата, переданная в исходном вызове логирования. Объединяется с |
имя |
|
Имя регистратора, используемого для регистрации вызова. |
имя пути |
|
Полное имя пути к исходному файлу, в котором был выполнен вызов журнализации (если доступно). |
процесс |
|
Идентификатор процесса (если имеется). |
processName |
|
Имя процесса (если доступно). |
relativeCreated |
|
Время в миллисекундах, когда была создана запись LogRecord, относительно времени загрузки модуля протоколирования. |
информация о стеке |
Вам не придется форматировать его самостоятельно. |
Информация о фрейме стека (если доступна) от нижней части стека в текущем потоке, до фрейма стека вызова регистрации, который привел к созданию этой записи, включительно. |
нить |
|
Идентификатор нити (если имеется). |
threadName |
|
Название нити (если имеется). |
taskName |
|
|
Изменено в версии 3.1: Было добавлено processName.
Изменено в версии 3.12: Было добавлено taskName.
Объекты LoggerAdapter¶
Экземпляры LoggerAdapter
используются для удобной передачи контекстной информации в вызовы логирования. Пример использования см. в разделе, посвященном adding contextual information to your logging output.
- class logging.LoggerAdapter(logger, extra, merge_extra=False)¶
Возвращает экземпляр
LoggerAdapter
, инициализированный базовым экземпляромLogger
, диктоподобным объектом (extra) и булевым значением (merge_extra), указывающим, следует ли объединять аргумент extra отдельных вызовов журнала с аргументомLoggerAdapter
extra. По умолчанию аргумент extra отдельных вызовов журнала игнорируется и используется только один из экземпляровLoggerAdapter
.- process(msg, kwargs)¶
Изменяет аргументы сообщения и/или ключевого слова, передаваемые вызову логирования, чтобы вставить контекстную информацию. Эта реализация принимает объект, переданный как extra в конструктор, и добавляет его в kwargs с помощью ключа „extra“. Возвращаемое значение - кортеж (msg, kwargs), содержащий (возможно, измененные) версии переданных аргументов.
- manager¶
Делегирует базовый
manager`
на logger.
- _log¶
Делегирует базовый метод
_log`()
на logger.
Кроме того,
LoggerAdapter
поддерживает следующие методыLogger
:debug()
,info()
,warning()
,error()
,exception()
,critical()
,log()
,isEnabledFor()
,getEffectiveLevel()
,setLevel()
иhasHandlers()
. Эти методы имеют те же сигнатуры, что и их аналоги вLogger
, поэтому вы можете использовать эти два типа экземпляров взаимозаменяемо.Изменено в версии 3.2: Методы
isEnabledFor()
,getEffectiveLevel()
,setLevel()
иhasHandlers()
были добавлены вLoggerAdapter
. Эти методы делегируют полномочия базовому регистратору.Изменено в версии 3.6: Были добавлены атрибут
manager
и метод_log()
, которые делегируют полномочия базовому регистратору и позволяют вложить адаптеры.Изменено в версии 3.13: Удалите недокументированный метод
warn`()
, который был псевдонимом методаwarning()
.Изменено в версии 3.13: Был добавлен аргумент merge_extra.
Безопасность нитей¶
Модуль протоколирования предназначен для обеспечения потокобезопасности без какой-либо специальной работы со стороны клиентов. Это достигается за счет использования потокобезопасных блокировок; существует одна блокировка для сериализации доступа к общим данным модуля, и каждый обработчик также создает блокировку для сериализации доступа к своему базовому вводу/выводу.
Если вы реализуете асинхронные обработчики сигналов с помощью модуля signal
, вы не сможете использовать протоколирование внутри таких обработчиков. Это связано с тем, что реализации блокировок в модуле threading
не всегда являются реентерабельными и поэтому не могут быть вызваны из таких обработчиков сигналов.
Функции уровня модуля¶
Помимо классов, описанных выше, существует ряд функций на уровне модулей.
- logging.getLogger(name=None)¶
Возвращает регистратор с указанным именем или, если name равно
None
, возвращает корневой регистратор иерархии. Если имя указано, оно обычно представляет собой разделенное точками иерархическое имя, например „a“, „a.b“ или „a.b.c.d“. Выбор этих имен полностью зависит от разработчика, использующего протоколирование, хотя рекомендуется использовать__name__
, если у вас нет особых причин не делать этого, как указано в Объекты регистратора.Все вызовы этой функции с заданным именем возвращают один и тот же экземпляр логгера. Это означает, что экземпляры регистраторов никогда не нужно передавать между различными частями приложения.
- logging.getLoggerClass()¶
Возвращает либо стандартный класс
Logger
, либо последний класс, переданный вsetLoggerClass()
. Эта функция может быть вызвана из нового определения класса, чтобы гарантировать, что установка настроенного классаLogger
не отменит настройки, уже примененные другим кодом. Например:class MyLogger(logging.getLoggerClass()): # ... override behaviour here
- logging.getLogRecordFactory()¶
Возвращает вызываемую переменную, которая используется для создания
LogRecord
.Added in version 3.2: Эта функция была предоставлена, наряду с
setLogRecordFactory()
, чтобы позволить разработчикам больше контроля над тем, как строитсяLogRecord
, представляющий событие журнализации.Дополнительную информацию о том, как вызывается фабрика, см. в разделе
setLogRecordFactory()
.
- logging.debug(msg, *args, **kwargs)¶
Это удобная функция, которая вызывает
Logger.debug()
на корневом логгере. Обработка аргументов во всех отношениях идентична той, что описана в этом методе.Единственное отличие заключается в том, что если у корневого регистратора нет обработчиков, то перед вызовом
debug
на корневом регистраторе вызываетсяbasicConfig()
.Для очень коротких сценариев или быстрой демонстрации возможностей
logging
могут быть удобныdebug
и другие функции уровня модуля. Однако большинство программ захотят тщательно и явно контролировать конфигурацию протоколирования и поэтому предпочтут создать логгер на уровне модуля и вызвать для негоLogger.debug()
(или другие методы, специфичные для данного уровня), как описано в начале этой документации.
- logging.info(msg, *args, **kwargs)¶
Записывает сообщение с уровнем
INFO
в корневой логгер. Аргументы и поведение в остальном такие же, как и дляdebug()
.
- logging.warning(msg, *args, **kwargs)¶
Записывает сообщение с уровнем
WARNING
в корневой логгер. Аргументы и поведение в остальном такие же, как и дляdebug()
.Примечание
Существует устаревшая функция
warn
, которая функционально идентичнаwarning
. Посколькуwarn
устарела, пожалуйста, не используйте ее - вместо нее используйтеwarning
.Изменено в версии 3.13: Удалите недокументированную функцию
warn()
, которая была псевдонимом для функцииwarning()
.
- logging.error(msg, *args, **kwargs)¶
Записывает сообщение с уровнем
ERROR
в корневой логгер. Аргументы и поведение в остальном такие же, как и дляdebug()
.
- logging.critical(msg, *args, **kwargs)¶
Записывает сообщение с уровнем
CRITICAL
в корневой логгер. Аргументы и поведение в остальном такие же, как и дляdebug()
.
- logging.exception(msg, *args, **kwargs)¶
Записывает сообщение с уровнем
ERROR
в корневой логгер. Аргументы и поведение в остальном такие же, как и дляdebug()
. В сообщение лога добавляется информация об исключении. Эту функцию следует вызывать только из обработчика исключений.
- logging.log(level, msg, *args, **kwargs)¶
Записывает сообщение с уровнем level в корневой логгер. Аргументы и поведение в остальном такие же, как и для
debug()
.
- logging.disable(level=CRITICAL)¶
Предоставляет переопределяющий уровень level для всех логгеров, который имеет приоритет над собственным уровнем логгера. Когда возникает необходимость временно сократить вывод логов во всем приложении, эта функция может оказаться полезной. Ее действие заключается в отключении всех вызовов логирования уровня * и ниже, так что если вы вызовете ее со значением INFO, то все события INFO и DEBUG будут отброшены, тогда как события уровня WARNING и выше будут обрабатываться в соответствии с эффективным уровнем логгера. Если вызвать
logging.disable(logging.NOTSET)
, то он фактически удаляет этот переопределяющий уровень, так что вывод журнала снова будет зависеть от эффективных уровней отдельных регистраторов.Обратите внимание, что если вы определили какой-либо пользовательский уровень протоколирования выше
CRITICAL
(это не рекомендуется), вы не сможете полагаться на значение по умолчанию для параметра level, а должны будете явно указать подходящее значение.Изменено в версии 3.7: Параметр level по умолчанию принимал значение уровня
CRITICAL
. Дополнительные сведения об этом изменении см. в разделе bpo-28524.
- logging.addLevelName(level, levelName)¶
Связывает уровень level с текстом levelName во внутреннем словаре, который используется для сопоставления числовых уровней с текстовым представлением, например, когда
Formatter
форматирует сообщение. Эта функция также может быть использована для определения собственных уровней. Единственными ограничениями являются то, что все используемые уровни должны быть зарегистрированы с помощью этой функции, уровни должны быть целыми положительными числами и увеличиваться в порядке возрастания серьезности.Примечание
Если вы хотите определить свои собственные уровни, обратитесь к разделу Пользовательские уровни.
- logging.getLevelNamesMapping()¶
Возвращает отображение имен уровней на соответствующие им уровни протоколирования. Например, строка «CRITICAL» отображается на
CRITICAL
. Возвращаемое отображение копируется из внутреннего отображения при каждом вызове этой функции.Added in version 3.11.
- logging.getLevelName(level)¶
Возвращает текстовое или числовое представление уровня протоколирования level.
Если level - это один из предопределенных уровней
CRITICAL
,ERROR
,WARNING
,INFO
илиDEBUG
, то вы получите соответствующую строку. Если вы связали уровни с именами с помощьюaddLevelName()
, то возвращается имя, которое вы связали с уровнем. Если передано числовое значение, соответствующее одному из определенных уровней, то возвращается соответствующее строковое представление.Параметр level также может принимать строковое представление уровня, например „INFO“. В таких случаях эта функция возвращает соответствующее числовое значение уровня.
Если не передано ни одного подходящего числового или строкового значения, возвращается строка „Level %s“ % level.
Примечание
Уровни являются внутренними целыми числами (так как они должны сравниваться в логике протоколирования). Эта функция используется для преобразования между целым уровнем и именем уровня, отображаемым в форматированном выводе журнала с помощью спецификатора формата
%(levelname)s
(см. Атрибуты LogRecord), и наоборот.Изменено в версии 3.4: В версиях Python, более ранних, чем 3.4, этой функции также можно было передать текстовый уровень, и она возвращала соответствующее числовое значение уровня. Это недокументированное поведение считалось ошибкой и было удалено в Python 3.4, но восстановлено в 3.4.2 из-за сохранения обратной совместимости.
- logging.getHandlerByName(name)¶
Возвращает обработчик с указанным именем, или
None
, если обработчика с таким именем не существует.Added in version 3.12.
- logging.getHandlerNames()¶
Возвращает неизменяемый набор всех известных имен обработчиков.
Added in version 3.12.
- logging.makeLogRecord(attrdict)¶
Создает и возвращает новый экземпляр
LogRecord
, атрибуты которого определены в attrdict. Эта функция полезна для получения словаря атрибутовLogRecord
, переданного по сокету, и восстановления его в виде экземпляраLogRecord
на принимающей стороне.
- logging.basicConfig(**kwargs)¶
Выполняет базовую настройку системы протоколирования, создавая
StreamHandler
сFormatter
по умолчанию и добавляя его к корневому регистратору. Функцииdebug()
,info()
,warning()
,error()
иcritical()
будут вызыватьbasicConfig()
автоматически, если для корневого логгера не определены обработчики.Эта функция ничего не делает, если в корневом регистраторе уже настроены обработчики, если только аргумент ключевого слова force не установлен в
True
.Примечание
Эту функцию следует вызывать из главного потока до запуска других потоков. В версиях Python до 2.7.1 и 3.2, если эта функция вызывается из нескольких потоков, возможно (в редких случаях), что обработчик будет добавлен к корневому регистратору более одного раза, что приведет к неожиданным результатам, таким как дублирование сообщений в журнале.
Поддерживаются следующие аргументы ключевых слов.
Формат
Описание
имя файла
Указывает на создание
FileHandler
с использованием указанного имени файла, а неStreamHandler
.filemode
Если указано filename, откройте файл в этом mode. По умолчанию -
'a'
.формат
Используйте указанную строку формата для обработчика. По умолчанию используются атрибуты
levelname
,name
иmessage
, разделенные двоеточиями.datefmt
Используйте указанный формат даты/времени, принятый
time.strftime()
.стиль
Если указан формат, используйте этот стиль для строки формата. Одно из
'%'
,'{'
или'$'
для printf-style,str.format()
илиstring.Template
соответственно. По умолчанию используется значение'%'
.уровень
Установите уровень корневого регистратора на указанное значение level.
поток
Используйте указанный поток для инициализации
StreamHandler
. Обратите внимание, что этот аргумент несовместим с filename - если присутствуют оба аргумента, возникает ошибкаValueError
.handlers
Если указано, то это должно быть итеративное множество уже созданных обработчиков для добавления в корневой логгер. Все обработчики, у которых еще не установлен формат, получат формат по умолчанию, созданный в этой функции. Обратите внимание, что этот аргумент несовместим с filename или stream - если присутствуют оба аргумента, возникает ошибка
ValueError
.силой
Если этот ключевой аргумент указан как true, все существующие обработчики, прикрепленные к корневому регистратору, будут удалены и закрыты, прежде чем будет выполнена настройка, указанная в других аргументах.
кодирование
Если этот ключевой аргумент указан вместе с filename, то его значение используется при создании
FileHandler
и, соответственно, при открытии выходного файла.ошибки
Если этот ключевой аргумент указан вместе с filename, то его значение используется при создании
FileHandler
и, соответственно, при открытии выходного файла. Если он не указан, используется значение „backslashreplace“. Обратите внимание, что если указанNone
, то он будет передан как таковой вopen()
, что означает, что это будет рассматриваться так же, как передача „errors“.Изменено в версии 3.2: Был добавлен аргумент style.
Изменено в версии 3.3: Добавлен аргумент handlers. Добавлены дополнительные проверки для выявления ситуаций, когда указаны несовместимые аргументы (например, handlers вместе с stream или filename, или stream вместе с filename).
Изменено в версии 3.8: Был добавлен аргумент force.
Изменено в версии 3.9: Добавлены аргументы encoding и errors.
- logging.shutdown()¶
Сообщает системе протоколирования о необходимости выполнить упорядоченное завершение работы путем промывки и закрытия всех обработчиков. Это должно вызываться при выходе приложения, и после этого вызова система протоколирования больше не должна использоваться.
Когда модуль протоколирования импортируется, он регистрирует эту функцию как обработчик выхода (см.
atexit
), поэтому обычно нет необходимости делать это вручную.
- logging.setLoggerClass(klass)¶
Указывает системе протоколирования использовать класс klass при инстанцировании регистратора. Класс должен определить
__init__()
так, чтобы требовался только аргумент name, а__init__()
должен вызыватьLogger.__init__()
. Эта функция обычно вызывается перед инстанцированием любых логгеров приложениями, которым необходимо использовать пользовательское поведение логгеров. После этого вызова, как и в любое другое время, не инстанцируйте логгеры напрямую с помощью подкласса: продолжайте использоватьlogging.getLogger()
. API для получения своих логгеров.
- logging.setLogRecordFactory(factory)¶
Установите вызываемую переменную, которая используется для создания
LogRecord
.- Параметры:
factory – Вызываемая фабрика, которая будет использоваться для создания записи журнала.
Added in version 3.2: Эта функция была предоставлена, наряду с
getLogRecordFactory()
, чтобы позволить разработчикам больше контроля над тем, как строитсяLogRecord
, представляющий событие журнализации.Фабрика имеет следующую подпись:
factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)
- имя:
Имя регистратора.
- уровень:
Уровень регистрации (числовой).
- fn:
Полное имя пути к файлу, в котором был выполнен вызов регистрации.
- lno:
Номер строки в файле, в которой был выполнен вызов журнала.
- msg:
Сообщение о регистрации.
- args:
Аргументы для сообщения журнализации.
- exc_info:
Кортеж исключений, или
None
.- func:
Имя функции или метода, вызвавшего вызов регистрации.
- sinfo:
Отслеживание стека, как это сделано в
traceback.print_stack()
, показывает иерархию вызовов.- kwargs:
Дополнительные аргументы в виде ключевых слов.
Атрибуты уровня модуля¶
- logging.lastResort¶
Через этот атрибут доступен «обработчик последней инстанции». Это
StreamHandler
, записывающий сообщение вsys.stderr
с уровнемWARNING
, и используется для обработки событий протоколирования в отсутствие какой-либо конфигурации протоколирования. В итоге сообщение просто выводится наsys.stderr
. Это заменяет предыдущее сообщение об ошибке, в котором говорилось, что «для регистратора XYZ не удалось найти обработчиков». Если вам по какой-то причине нужно прежнее поведение,lastResort
можно установить наNone
.Added in version 3.2.
- logging.raiseExceptions¶
Используется для проверки того, следует ли распространять исключения во время обработки.
По умолчанию:
True
.Если
raiseExceptions
равноFalse
, исключения будут молча игнорироваться. Это то, что в основном нужно для системы протоколирования - большинство пользователей не будут заботиться об ошибках в системе протоколирования, их больше интересуют ошибки приложений.
Интеграция с модулем предупреждений¶
Функция captureWarnings()
может быть использована для интегрирования logging
с модулем warnings
.
- logging.captureWarnings(capture)¶
Эта функция используется для включения и выключения перехвата предупреждений при регистрации.
Если значение capture равно
True
, предупреждения, выданные модулемwarnings
, будут перенаправлены в систему протоколирования. В частности, предупреждение будет отформатировано с помощьюwarnings.formatwarning()
и полученная строка будет записана в журнал с именем'py.warnings'
и степенью серьезностиWARNING
.Если значение capture равно
False
, перенаправление предупреждений в систему протоколирования будет прекращено, и предупреждения будут перенаправлены по своим первоначальным адресам (т. е. по тем, которые действовали до вызоваcaptureWarnings(True)
).
См.также
- Модуль
logging.config
API конфигурации для модуля протоколирования.
- Модуль
logging.handlers
Полезные обработчики, входящие в состав модуля протоколирования.
- PEP 282 - Система ведения журнала
Предложение, описывающее эту возможность для включения в стандартную библиотеку Python.
- Original Python logging package
Это оригинальный источник пакета
logging
. Версия пакета, доступная с этого сайта, подходит для использования с Python 1.5.2, 2.1.x и 2.2.x, которые не включают пакетlogging
в стандартную библиотеку.