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 -
Если значение этого атрибута истинно, события, записанные в журнал этим регистратором, будут переданы обработчикам регистраторов более высокого уровня (предков) в дополнение к обработчикам, подключённым к этому регистратору. Сообщения передаются непосредственно обработчикам регистраторов-предков — уровни и фильтры соответствующих регистраторов-предков не учитываются.
Если значение этого атрибута ложно, сообщения журнала не передаются обработчикам регистраторов-предков.
Поясним на примере: если значение атрибута 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, то обработчики последнего такого регистратора будут последними, которым предложат обработать событие, и дальнейшая передача прекратится.Конструктор задаёт для этого атрибута значение
True.Примечание
Если подключить обработчик к регистратору и к одному или нескольким его предкам, одна и та же запись может быть выведена несколько раз. Как правило, не требуется подключать обработчик более чем к одному регистратору: если подключить его к подходящему регистратору, находящемуся выше всех в иерархии, он будет получать все события, записанные всеми регистраторами-потомками, если для них оставлено значение
Trueатрибута propagate. Часто обработчики подключают только к корневому регистратору, позволяя передаче сообщений позаботиться обо всём остальном.
-
handlers -
Список обработчиков, непосредственно подключённых к этому экземпляру регистратора.
Примечание
Этот атрибут следует считать доступным только для чтения; обычно его изменяют с помощью методов
addHandler()иremoveHandler(), которые используют блокировки для обеспечения потокобезопасности.
-
disabled -
Этот атрибут отключает обработку любых событий. В инициализаторе ему присваивается значение
False; изменяется он только кодом настройки ведения журнала.Примечание
Этот атрибут следует считать доступным только для чтения.
-
setLevel(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() -
Возвращает эффективный уровень этого регистратора. Если с помощью
setLevel()задано значение, отличное отNOTSET, возвращается оно. В противном случае иерархия обходится в направлении корневого регистратора, пока не будет найдено значение, отличное отNOTSET; это значение и возвращается. Возвращаемое значение является целым числом, обычно одним изlogging.DEBUG,logging.INFOи т. д.
-
getChild(suffix) -
Возвращает регистратор-потомок этого регистратора, определяемый суффиксом. Так,
logging.getLogger('abc').getChild('def.ghi')вернёт тот же регистратор, что иlogging.getLogger('abc.def.ghi'). Это вспомогательный метод, удобный, когда имя родительского регистратора задано, например, с помощью__name__, а не строковым литералом.Добавлено в версии 3.2.
-
getChildren() -
Возвращает множество регистраторов, являющихся непосредственными потомками этого регистратора. Например,
logging.getLogger().getChildren()может вернуть множество, содержащее регистраторы с именамиfooиbar, но регистратор с именемfoo.barв это множество не войдёт. Аналогично,logging.getLogger('foo').getChildren()может вернуть множество, содержащее регистратор с именемfoo.bar, но регистратор с именемfoo.bar.bazв него не войдёт.Добавлено в версии 3.12.
-
debug(msg, *args, **kwargs) -
Записывает в журнал сообщение с уровнем
DEBUGдля этого регистратора. msg — строка формата сообщения, а args — аргументы, которые объединяются с msg с помощью оператора форматирования строк. (Это означает, что в строке формата можно использовать ключевые слова вместе с одним аргументом-словарём.) Если args не переданы, форматирование с помощью % для msg не выполняется.Проверяются четыре именованных аргумента из kwargs: exc_info, stack_info, stacklevel и extra.
Если значение exc_info истинно, в сообщение журнала добавляются сведения об исключении. Если передан кортеж исключения (в формате, возвращаемом
sys.exc_info()) или экземпляр исключения, используется он; в противном случае вызываетсяsys.exc_info(), чтобы получить сведения об исключении.Второй необязательный именованный аргумент — stack_info; по умолчанию он равен
False. Если его значение истинно, в сообщение журнала добавляются сведения о стеке, включая сведения о текущем вызове ведения журнала. Обратите внимание: это не те же сведения о стеке, которые выводятся при указании exc_info: в первом случае выводятся кадры стека от его основания до вызова ведения журнала в текущем потоке, а во втором — сведения о кадрах стека, которые были удалены при поиске обработчиков исключений после возникновения исключения.Можно указывать stack_info независимо от exc_info, например, чтобы просто показать, как выполнение дошло до определённого места в коде, даже если исключений не возникало. Кадры стека выводятся после строки заголовка со следующим текстом:
Stack (most recent call last):
Это имитирует
Traceback (most recent call last):, используемое при отображении кадров исключения.Третий необязательный именованный аргумент — stacklevel; по умолчанию он равен
1. Если его значение больше 1, при вычислении номера строки и имени функции, записываемых вLogRecord, созданную для события журнала, пропускается соответствующее количество кадров стека. Это можно использовать во вспомогательных функциях ведения журнала, чтобы в качестве имени функции, имени файла и номера строки записывались сведения о вызывающем коде, а не о самой вспомогательной функции или методе. Имя этого параметра соответствует имени аналогичного параметра в модулеwarnings.Четвёртый именованный аргумент — extra. Его можно использовать для передачи словаря, который заполняет
__dict__объекта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. Если этих атрибутов нет, сообщение не будет записано в журнал из-за ошибки форматирования строки. Поэтому в данном случае словарь extra всегда должен содержать эти ключи.Хотя это может показаться неудобным, эта функция предназначена для использования в особых случаях, например на многопоточных серверах, где один и тот же код выполняется в разных контекстах, а интересующие условия зависят от контекста (например, IP-адрес удалённого клиента и имя аутентифицированного пользователя в приведённом выше примере). В таких случаях, вероятно, будут использоваться специализированные форматтеры
Formatterс определёнными обработчикамиHandler.Если к этому регистратору (или к любому из его предков с учётом соответствующих атрибутов
Logger.propagate) не подключён обработчик, сообщение будет отправлено обработчику, заданному вlastResort.Изменено в версии 3.2: Добавлен параметр stack_info.
Изменено в версии 3.5: Параметр exc_info теперь может принимать экземпляры исключений.
Изменено в версии 3.8: Добавлен параметр stacklevel.
-
info(msg, *args, **kwargs) -
Записывает в журнал сообщение с уровнем
INFOдля этого регистратора. Аргументы интерпретируются так же, как дляdebug().
-
warning(msg, *args, **kwargs) -
Записывает в журнал сообщение с уровнем
WARNINGдля этого регистратора. Аргументы интерпретируются так же, как дляdebug().Примечание
Существует устаревший метод
warn, функционально идентичныйwarning. Посколькуwarnсчитается устаревшим, не используйте его — вместо него используйтеwarning.
-
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) -
Определяет имя исходного файла и номер строки вызывающего кода. Возвращает имя файла, номер строки, имя функции и сведения о стеке в виде кортежа из четырёх элементов. Сведения о стеке возвращаются как
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: это будет последний регистратор, у которого проверяется наличие обработчиков.Добавлено в версии 3.2.
Изменено в версии 3.7: Регистраторы теперь можно сериализовать и десериализовать с помощью pickle.
-
Уровни ведения журнала
Числовые значения уровней ведения журнала приведены в следующей таблице. Они важны главным образом в том случае, если вы хотите определить собственные уровни и задать для них определённые значения относительно предопределённых уровней. Если определить уровень с тем же числовым значением, он заменит предопределённый уровень, а предопределённое имя будет потеряно.
Уровень | Числовое значение | Значение / Когда использовать |
|---|---|---|
| 0 | Если задан для регистратора, указывает, что для определения эффективного уровня следует обратиться к регистраторам-предкам. Если в результате по-прежнему получается |
| 10 | Подробные сведения, обычно представляющие интерес только для разработчика, пытающегося диагностировать проблему. |
| 20 | Подтверждение того, что всё работает ожидаемым образом. |
| 30 | Указывает на то, что произошло что-то неожиданное или в ближайшее время может возникнуть проблема (например, «мало места на диске»). Программа по-прежнему работает ожидаемым образом. |
| 40 | Из-за более серьёзной проблемы программа не смогла выполнить некоторую функцию. |
| 50 | Серьёзная ошибка, указывающая на то, что сама программа, возможно, не сможет продолжить работу. |
Объекты обработчиков
Обработчики имеют следующие атрибуты и методы. Обратите внимание, что Handler никогда не создаётся напрямую; этот класс служит базовым для более полезных подклассов. Однако метод __init__() в подклассах должен вызывать Handler.__init__().
-
class logging.Handler -
-
__init__(level=NOTSET) -
Инициализирует экземпляр
Handler, устанавливая его уровень, присваивая списку фильтров пустой список и создавая блокировку (с помощьюcreateLock()) для последовательного доступа к механизму ввода-вывода.
-
createLock() -
Инициализирует блокировку потока, которую можно использовать для последовательного доступа к базовым функциям ввода-вывода, которые могут быть небезопасны для использования в нескольких потоках.
-
acquire() -
Захватывает блокировку потока, созданную с помощью
createLock().
-
release() -
Освобождает блокировку потока, захваченную с помощью
acquire().
-
setLevel(level) -
Устанавливает пороговый уровень этого обработчика равным level. Сообщения журнала с уровнем ниже level будут игнорироваться. При создании обработчика его уровень устанавливается в
NOTSET(что приводит к обработке всех сообщений).Список уровней см. в разделе Уровни журналирования.
Изменено в версии 3.2: Теперь параметр level принимает строковое представление уровня, например «INFO», в качестве альтернативы целочисленным константам, таким как
INFO.
-
setFormatter(fmt) -
Устанавливает форматировщик этого обработчика равным fmt. Аргумент fmt должен быть экземпляром
FormatterилиNone.
-
addFilter(filter) -
Добавляет указанный фильтр filter к этому обработчику.
-
removeFilter(filter) -
Удаляет указанный фильтр filter из этого обработчика.
-
filter(record) -
Применяет фильтры этого обработчика к записи и возвращает
True, если запись следует обработать. Фильтры проверяются по очереди, пока один из них не вернёт ложное значение. Если ни один из них не вернёт ложное значение, запись будет выведена. Если один из фильтров вернёт ложное значение, обработчик не выведет запись.
-
flush() -
Гарантирует сброс всех выходных данных журнала. Эта версия ничего не делает и предназначена для реализации в подклассах.
-
close() -
Освобождает ресурсы, используемые обработчиком. Эта версия ничего не выводит, но удаляет обработчик из внутренней карты обработчиков, которая используется для поиска обработчиков по имени.
Подклассы должны гарантировать вызов этого метода из переопределённых методов
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) – Строка форматирования в заданном стиле style для всего выводимого сообщения журнала. Возможные ключи соответствия берутся из атрибутов объекта
LogRecordАтрибуты LogRecord. Если не указано, используется'%(message)s'— то есть только сообщение журнала. -
datefmt (str) – Строка форматирования в заданном стиле style для даты и времени в выводимом сообщении журнала. Если не указано, используется значение по умолчанию, описанное в
formatTime(). -
style (str) – Может принимать одно из значений
'%','{'или'$'и определяет способ объединения строки форматирования с данными: с помощью форматирования строк в стиле printf (%),str.format()({) илиstring.Template($). Это относится только к fmt и datefmt (например,'%(message)s'в отличие от'{message}'), но не к самим сообщениям журнала, передаваемым методам журналирования. Однако существуют другие способы использовать форматирование сообщений журнала в стилях{и$. -
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})
-
fmt (str) – Строка форматирования в заданном стиле style для всего выводимого сообщения журнала. Возможные ключи соответствия берутся из атрибутов объекта
Изменено в версии 3.2: Добавлен параметр style.
Изменено в версии 3.8: Добавлен параметр validate.
Изменено в версии 3.10: Добавлен параметр defaults.
-
format(record) -
Словарь атрибутов записи используется как операнд операции форматирования строки. Возвращает полученную строку. Перед форматированием словаря выполняется несколько подготовительных действий. Атрибут записи message вычисляется с помощью msg % args. Если строка форматирования содержит
'(asctime)', для форматирования времени события вызываетсяformatTime(). Если имеется информация об исключении, она форматируется с помощьюformatException()и добавляется к сообщению. Обратите внимание, что отформатированная информация об исключении кэшируется в атрибуте exc_text. Это полезно, поскольку информацию об исключении можно сериализовать с помощью pickle и передавать по сети, однако следует соблюдать осторожность, если у вас есть несколько подклассов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) -
Возвращает заголовок для списка records. Базовая реализация просто возвращает пустую строку. Чтобы задать особое поведение, например отображать количество записей, заголовок или разделительную строку, необходимо переопределить этот метод.
-
Возвращает нижний колонтитул для списка records. Базовая реализация просто возвращает пустую строку. Чтобы задать особое поведение, например отображать количество записей или разделительную строку, необходимо переопределить этот метод.
-
format(records) -
Возвращает отформатированный текст для списка 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) -
Следует ли записывать указанную запись? Возвращает ложное значение, если нет, и истинное, если да. Фильтры могут изменять записи журнала на месте или возвращать совершенно другой экземпляр записи, который заменит исходную запись журнала при дальнейшей обработке события.
-
Обратите внимание, что фильтры, подключённые к обработчикам, проверяются перед выводом события обработчиком, тогда как фильтры, подключённые к регистраторам, проверяются при каждой записи события (с помощью 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) – Числовой уровень события журналирования (например,
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) – Текстовая строка с информацией о стеке от его начала в текущем потоке до вызова журналирования.
-
name (str) – Имя регистратора, использованного для записи события, представленного этим объектом
-
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 |
| Время создания |
created |
| Время создания |
exc_info | Обычно это не требуется форматировать самостоятельно. | Кортеж исключения (по аналогии с |
filename |
| Имя файла из |
funcName |
| Имя функции, содержащей вызов журналирования. |
levelname |
| Текстовое название уровня журналирования для сообщения ( |
levelno |
| Числовое значение уровня журналирования для сообщения ( |
lineno |
| Номер строки исходного кода, в которой был вызван механизм журналирования (если доступен). |
message |
| Записанное в журнал сообщение, вычисленное как |
module |
| Модуль (имя из |
msecs |
| Миллисекундная часть времени создания |
msg | Обычно это не требуется форматировать самостоятельно. | Строка формата, переданная в исходный вызов журналирования. Объединяется с |
name |
| Имя регистратора, использованного для журналирования вызова. |
pathname |
| Полный путь к исходному файлу, в котором был вызван механизм журналирования (если доступен). |
process |
| Идентификатор процесса (если доступен). |
processName |
| Имя процесса (если доступно). |
relativeCreated |
| Время в миллисекундах с момента создания LogRecord относительно момента загрузки модуля журналирования. |
stack_info | Обычно это не требуется форматировать самостоятельно. | Информация о кадрах стека (если доступна), начиная с нижней части стека в текущем потоке и до кадра стека включительно, в котором был вызван механизм журналирования, приведший к созданию этой записи. |
thread |
| Идентификатор потока (если доступен). |
threadName |
| Имя потока (если доступно). |
taskName |
| Имя |
Изменено в версии 3.1: Добавлен атрибут processName.
Изменено в версии 3.12: Добавлен атрибут taskName.
Объекты LoggerAdapter
Экземпляры LoggerAdapter используются для удобной передачи контекстной информации в вызовы журналирования. Пример использования см. в разделе добавление контекстной информации в вывод журнала.
-
class logging.LoggerAdapter(logger, extra) -
Возвращает экземпляр
LoggerAdapter, инициализированный базовым экземпляромLoggerи объектом, подобным словарю.-
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: В
LoggerAdapterдобавлены методыisEnabledFor(),getEffectiveLevel(),setLevel()иhasHandlers(). Эти методы делегируют вызовы базовому регистратору.Изменено в версии 3.6: Добавлены атрибут
managerи метод_log(), которые делегируют вызовы базовому регистратору и позволяют создавать вложенные адаптеры. -
Потокобезопасность
Модуль журналирования разработан как потокобезопасный, поэтому клиентам не требуется выполнять какие-либо специальные действия. Это обеспечивается с помощью блокировок потоков: одна блокировка сериализует доступ к общим данным модуля, а каждый обработчик также создаёт блокировку для сериализации доступа к базовым средствам ввода-вывода.
Если вы реализуете асинхронные обработчики сигналов с помощью модуля signal, возможно, вы не сможете использовать журналирование внутри таких обработчиков. Это связано с тем, что реализации блокировок в модуле threading не всегда допускают повторный вход, поэтому их нельзя вызывать из таких обработчиков сигналов.
Функции уровня модуля
Помимо описанных выше классов, существует ряд функций уровня модуля.
-
logging.getLogger(name=None) -
Возвращает регистратор с указанным именем или, если имя равно
None, корневой регистратор иерархии. Если имя указано, обычно это иерархическое имя, разделённое точками, например ‘a’, ‘a.b’ или ‘a.b.c.d’. Выбор таких имён полностью зависит от разработчика, использующего ведение журналов, хотя рекомендуется использовать__name__, если у вас нет особой причины поступить иначе, как упомянуто в разделе Объекты Logger.Все вызовы этой функции с заданным именем возвращают один и тот же экземпляр регистратора. Это означает, что экземпляры регистраторов никогда не нужно передавать между разными частями приложения.
-
logging.getLoggerClass() -
Возвращает либо стандартный класс
Logger, либо последний класс, переданный вsetLoggerClass(). Эту функцию можно вызвать внутри определения нового класса, чтобы убедиться, что установка пользовательского классаLoggerне отменит настройки, ранее применённые другим кодом. Например:class MyLogger(logging.getLoggerClass()): # ... override behaviour here
-
logging.getLogRecordFactory() -
Возвращает вызываемый объект, используемый для создания
LogRecord.Добавлено в версии 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.
-
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 для всех регистраторов, который имеет приоритет над собственным уровнем регистратора. Эта функция может быть полезна, если нужно временно ограничить вывод журналов во всём приложении. Она отключает все вызовы журналирования с уровнем важности 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. При каждом вызове этой функции возвращается копия внутреннего отображения.Добавлено в версии 3.11.
-
logging.getLevelName(level) -
Возвращает текстовое или числовое представление уровня ведения журнала level.
Если level — один из предопределённых уровней
CRITICAL,ERROR,WARNING,INFOилиDEBUG, возвращается соответствующая строка. Если уровни были связаны с именами с помощьюaddLevelName(), возвращается имя, связанное с level. Если передано числовое значение, соответствующее одному из определённых уровней, возвращается соответствующее строковое представление.Параметр level также принимает строковое представление уровня, например «INFO». В этом случае функция возвращает соответствующее числовое значение уровня.
Если передано неподходящее числовое или строковое значение, возвращается строка ‘Level %s’ % level.
Примечание
Внутренне уровни представлены целыми числами (поскольку их нужно сравнивать в логике ведения журналов). Эта функция преобразует целочисленный уровень в имя уровня, отображаемое в форматированном выводе журнала с помощью спецификатора формата
%(levelname)s(см. раздел Атрибуты LogRecord), и наоборот.Изменено в версии 3.4: В версиях Python до 3.4 этой функции также можно было передать текстовый уровень, и она возвращала соответствующее числовое значение. Такое недокументированное поведение сочли ошибкой и удалили в Python 3.4, но восстановили в версии 3.4.2 для сохранения обратной совместимости.
-
logging.getHandlerByName(name) -
Возвращает обработчик с указанным именем name или
None, если обработчика с таким именем нет.Добавлено в версии 3.12.
-
logging.getHandlerNames() -
Возвращает неизменяемое множество всех известных имён обработчиков.
Добавлено в версии 3.12.
-
logging.makeLogRecord(attrdict) -
Создаёт и возвращает новый экземпляр
LogRecord, атрибуты которого определяются значением attrdict. Эта функция полезна для получения сериализованного с помощью pickle словаря атрибутовLogRecord, отправленного через сокет, и восстановления из него экземпляраLogRecordна принимающей стороне.
-
logging.basicConfig(**kwargs) -
Выполняет базовую настройку системы ведения журналов: создаёт
StreamHandlerс объектомFormatterпо умолчанию и добавляет его к корневому регистратору. Функцииdebug(),info(),warning(),error()иcritical()автоматически вызываютbasicConfig(), если для корневого регистратора не определены обработчики.Эта функция ничего не делает, если у корневого регистратора уже настроены обработчики, кроме случая, когда ключевому аргументу force присвоено значение
True.Примечание
Эту функцию следует вызывать из главного потока до запуска других потоков. В версиях Python до 2.7.1 и 3.2 при вызове этой функции из нескольких потоков (в редких случаях) обработчик может быть добавлен к корневому регистратору более одного раза, что приведёт к неожиданным результатам, например к дублированию сообщений в журнале.
Поддерживаются следующие ключевые аргументы.
Формат
Описание
filename
Указывает, что вместо
StreamHandlerследует создатьFileHandler, используя указанное имя файла.filemode
Если указано значение filename, открыть файл в этом режиме. По умолчанию используется
'a'.format
Использовать для обработчика указанную строку формата. По умолчанию используются атрибуты
levelname,nameиmessage, разделённые двоеточиями.datefmt
Использовать указанный формат даты и времени, поддерживаемый функцией
time.strftime().style
Если указан параметр format, использовать этот стиль для строки формата. Один из вариантов:
'%','{'или'$'— соответственно для стиля printf,str.format()илиstring.Template. По умолчанию используется'%'.level
Задать корневому регистратору указанный уровень.
stream
Использовать указанный поток для инициализации
StreamHandler. Обратите внимание: этот аргумент несовместим с filename — если указаны оба, вызывается исключениеValueError.handlers
Если указан, это должен быть итерируемый объект с уже созданными обработчиками, которые следует добавить к корневому регистратору. Обработчикам, для которых ещё не задан форматировщик, будет назначен форматировщик по умолчанию, созданный этой функцией. Обратите внимание: этот аргумент несовместим с filename и stream — если указаны несовместимые аргументы, вызывается исключение
ValueError.force
Если этому ключевому аргументу присвоено значение true, все существующие обработчики, подключённые к корневому регистратору, удаляются и закрываются перед выполнением настройки, заданной другими аргументами.
encoding
Если этот ключевой аргумент указан вместе с filename, его значение используется при создании
FileHandlerи, следовательно, при открытии выходного файла.errors
Если этот ключевой аргумент указан вместе с 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() -
Предписывает системе ведения журналов корректно завершить работу, сбросив буферы и закрыв все обработчики. Эту функцию следует вызвать при завершении приложения; после её вызова систему ведения журналов больше не следует использовать.
При импорте модуля logging эта функция регистрируется как обработчик выхода (см.
atexit), поэтому обычно нет необходимости делать это вручную.
-
logging.setLoggerClass(klass) -
Указывает системе ведения журналов использовать класс klass при создании экземпляров регистраторов. Класс должен определять
__init__()так, чтобы требовался только аргумент name, а__init__()должен вызыватьLogger.__init__(). Обычно эту функцию вызывают до создания каких-либо регистраторов в приложениях, которым требуется пользовательское поведение регистратора. После этого вызова, как и в любое другое время, не создавайте экземпляры регистраторов напрямую с помощью подкласса: продолжайте использовать APIlogging.getLogger()для получения регистраторов.
-
logging.setLogRecordFactory(factory) -
Задаёт вызываемый объект, используемый для создания
LogRecord.- Параметры:
-
factory – Вызываемый объект фабрики, используемый для создания записи журнала.
Добавлено в версии 3.2: Эта функция была предоставлена вместе с
getLogRecordFactory(), чтобы дать разработчикам больше контроля над созданиемLogRecord, представляющей событие журналирования.Фабрика имеет следующую сигнатуру:
factory(name, level, fn, lno, msg, args, exc_info, func=None, sinfo=None, **kwargs)- name:
-
Имя регистратора.
- level:
-
Уровень ведения журнала (числовой).
- fn:
-
Полный путь к файлу, в котором был выполнен вызов журналирования.
- lno:
-
Номер строки в файле, в которой был выполнен вызов журналирования.
- msg:
-
Сообщение для журнала.
- args:
-
Аргументы сообщения для журнала.
- exc_info:
-
Кортеж с информацией об исключении или
None. - func:
-
Имя функции или метода, вызвавшего журналирование.
- sinfo:
-
Трассировка стека, например полученная с помощью
traceback.print_stack(), показывающая иерархию вызовов. - kwargs:
-
Дополнительные ключевые аргументы.
Атрибуты уровня модуля
-
logging.lastResort -
Через этот атрибут доступен «обработчик последней надежды». Это
StreamHandler, выполняющий запись вsys.stderrс уровнемWARNING; он используется для обработки событий журналирования при отсутствии какой-либо конфигурации ведения журналов. В результате сообщение просто выводится вsys.stderr. Это заменяет прежнее сообщение об ошибке «для регистратора XYZ не удалось найти обработчики». Если вам по какой-либо причине нужно прежнее поведение,lastResortможно присвоить значениеNone.Добавлено в версии 3.2.
-
logging.raiseExceptions -
Используется для проверки того, следует ли передавать исключения, возникающие при обработке.
По умолчанию:
True.Если
raiseExceptionsравноFalse, исключения молча игнорируются. Обычно именно это и требуется от системы ведения журналов: большинство пользователей не интересуют ошибки в самой системе ведения журналов, их больше интересуют ошибки приложения.
Интеграция с модулем warnings
Функцию captureWarnings() можно использовать для интеграции logging с модулем warnings.
-
logging.captureWarnings(capture) -
Эта функция включает и отключает перехват предупреждений системой ведения журналов.
Если capture равно
True, предупреждения, выдаваемые модулемwarnings, перенаправляются в систему ведения журналов. В частности, предупреждение форматируется с помощьюwarnings.formatwarning(), а полученная строка записывается в регистратор с именем'py.warnings'и уровнем важностиWARNING.Если capture равно
False, перенаправление предупреждений в систему ведения журналов прекращается, и предупреждения снова направляются в исходные места назначения (то есть те, которые использовались до вызоваcaptureWarnings(True)).
См. также
-
Modulelogging.config -
API конфигурации модуля ведения журналов.
-
Modulelogging.handlers -
Полезные обработчики, входящие в состав модуля ведения журналов.
- PEP 282 — Система ведения журналов
-
Предложение, в котором описывалась эта возможность для включения в стандартную библиотеку Python.
- Исходный пакет ведения журналов Python
-
Это первоначальный источник пакета
logging. Версия пакета, доступная на этом сайте, подходит для Python 1.5.2, 2.1.x и 2.2.x, в стандартную библиотеку которых не входит пакетlogging.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/logging.html