logging
— Средство журналирования для Python¶
Исходный код: Lib/logging/__init__.py
Модуль определяет функции и классы, реализующие гибкую систему логирования событий для приложений и библиотек.
Ключевое преимущество использования API-интерфейса логирования, предоставляемого стандартного библиотечным модулем, заключается в том, что все модули Python могут участвовать в логировании, поэтому журналирование приложений может включать ваши собственные сообщения, интегрированные с сообщениями сторонних модулей.
Модуль обеспечивает большую функциональность и гибкость. Если Вы незнакомы с logging, лучший способ разобраться с ним - это прочитать учебные пособия (см. ссылки справа).
Основные классы, определенные модулем, вместе с их функциями перечислены ниже.
- Логгеры выставляют интерфейс, который непосредственно использует заявление код.
- Обработчики отправляют записи журнала (созданные логгеры) в соответствующее место назначения.
- Фильтры обеспечивают более тонкое зернистое средство для определения, какие записи журнала следует выводить.
- Форматеры определяют формат записей журнала в окончательном выводе.
Объекты Logger¶
Логгеры имеют следующие атрибуты и методы. Обратите внимание, что
логгеры не должены НИКОГДА создаваться непосредственно, но
всегда через функцию уровня модуля logging.getLogger(name)
. Селекторные совещания к
getLogger()
с тем же именем всегда будут возвращает ссылка на тот же объект
логгера.
name
потенциально является разделенной на периоды иерархической
значение, как foo.bar.baz
(хотя это также может быть просто foo
,
например). Логгеры, которые далее вниз в иерархическом списке являются
потомками логгеры выше в списке. Например, дано логгер с именем
foo
, логгеры с именами foo.bar
, foo.bar.baz
и foo.bam
- все
потомки foo
. Иерархия имени логгер походит на иерархию пакета
Python, и идентичный ему, если вы организуете свой логгеры на основе за
модуль, используя рекомендуемое строительство logging.getLogger(__name__)
. Это потому, что в
модуле __name__
является именем модуля в пространстве имен пакета
Python.
-
class
logging.
Logger
¶ -
propagate
¶ Если этот атрибут оценит к истинному, то события, зарегистрированные к этому логгера, будут переданы к обработчики более высокого уровня (предок) логгеры, в дополнение к любому обработчики, приложенному к этому логгер. Сообщения переданы непосредственно предку логгеры обработчики - ни уровень, ни фильтры предка, которым рассматривают рассматриваемые логгеры.
Если значение равно false, логирование сообщения не передаются в обработчики предка логгера.
Конструктор задает для этого атрибут значение
True
.Примечание
Если прикрепить обработчик к логгеру b одному или нескольким его предкам, он может испускать одну и ту же запись несколько раз. В общем случае не нужно присоединять обработчик к нескольким логгер - если просто прикрепить его к соответствующей логгер, которая является самой высокой в иерархии логгер, то она увидит все события, записанные всеми дочерними логгеры, при условии, что их настройка распространения оставлена равной
True
. Обычный сценарий - прикрепить обработчики только к корню логгер, и позволить распространению позаботиться об остальном.
-
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)¶ Возвращает a логгер, который является потомком этого логгера, как определено суффиксом. Таким образом
logging.getLogger('abc').getChild('def.ghi')
был бы возвращает тот же логгер, как будет возвращенныйlogging.getLogger('abc.def.ghi')
. Это удобный метод, полезный, когда родительский логгер называется, например,__name__
, а не литерал строки.Добавлено в версии 3.2.
-
debug
(msg, *args, **kwargs)¶ Регистрирует сообщение с уровнем
DEBUG
на этом логгере. msg является форматом сообщения строка, а args - аргументами, объединяемыми в msg с помощью оператора форматирования строка. (Обратите внимание, что это означает, что ключевые слова можно использовать в формате строка вместе с одним аргументом словаря.) Никакая операция по форматированию % не выполнена на msg, когда не передается args.В kwargs есть четыре ключевой аргумента, которые проверяются: exc_info, stack_info, stacklevel и extra.
Если exc_info не оценивает как ложный, он заставляет информацию об исключении быть добавленной к сообщению логирование. Если предусмотрен кортеж исключений (в формате возвращенный по
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, который может быть используемый, чтобы передать словарь, который является используемый, чтобы заполнить __dict__
LogRecord
, созданного для события логирование с определенным пользователями атрибуты. Эти пользовательские атрибуты могут быть используемый, как вы хотите. Например, они могут быть включены в зарегистрированные сообщения. Например:FORMAT = '%(asctime)-15s %(clientip)s %(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, не должны сталкиваться с ключами используемый системой логирование. (См. документацию
Formatter
, для получения дополнительной информации о которой ключи - используемый системой логирование.)Если вы принимаете решение использовать эти атрибуты в зарегистрированных сообщениях, вы должны проявить некоторую заботу. В вышеприведенном примере, для сущность,
Formatter
был настроен в формате строка, который ожидает „clientip“ и „user“ в словаре атрибутLogRecord
. Если они отсутствуют, сообщение не будет записано в журнал, так как произойдет исключение форматирования строка. Так что в этом случае всегда нужно передать словарь extra с этими ключами.В то время как это могло бы быть раздражающим, эта особенность предназначена для использования при специализированных обстоятельствах, таких как многопоточные серверы, где тот же код выполняет во многих контекстах, и интересные условия, которые возникают, зависят от этого контекст (такого как удаленный IP-адрес клиента и заверенное имя пользователя в вышеупомянутом примере). В таких обстоятельствах, вероятно, специализированный
Formatter
будет используемый с конкретнымHandler
.Изменено в версии 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)¶ Поиск имени исходного файла и номера строки вызывающего абонента. Возвращает имя файла, номер строки, имя функции и информацию стека в виде 4-элементного кортежа. Информация стека является возвращенный как
None
, если stack_info не являетсяTrue
.Параметр stacklevel передается от код, вызывающего
debug()
и другие API. Если больше, чем 1, избыток - используемый, чтобы пропустить структуры стека прежде, чем определить значения, чтобы быть возвращенный. Это обычно будет полезно, называя API логирование от помощника/обертки код, так, чтобы информация в конечном счете зарегистрировалась, отсылает не к помощнику/обертке код, но к код, который называет его.
-
handle
(record)¶ Обрабатывает запись, передавая её всем обработчики, связанным с этим логгер и его предками (пока не будет найдена ложная значение propagate). Этот метод - используемый для несоленых отчетов, полученных от сокет, а также созданных в местном масштабе. Фильтрация логгер-level применяется с помощью
filter()
.
-
makeRecord
(name, level, fn, lno, msg, args, exc_info, func=None, extra=None, sinfo=None)¶ Это метод фабрика, которая может быть переопределена в подклассах для создания специализированных
LogRecord
сущностей.
-
hasHandlers
()¶ Проверки, чтобы видеть, есть ли у этого логгер какой-либо настроенный обработчики. Это делается путем поиска обработчики в этом логгер и его родителей в иерархии логгер. Возвращает
True
если найден обработчик, иначеFalse
. Метод прекращает искать иерархию каждый раз, когда логгер с „размножением“ набора атрибут к ложному найден - который будет последним логгер, который проверен на существование обработчики.Добавлено в версии 3.2.
Изменено в версии 3.7: Теперь логгеры можно pickled и unpickled.
-
Уровни логирования¶
Числовые значения уровней логирование даны в следующей таблице. Они, прежде всего, представляют интерес, если вы хотите определить свои собственные уровни и нуждаетесь в них, чтобы иметь определенный значения относительно предопределенных уровней. При определении уровня с теми же числовыми значение он перезаписывает предопределенные значение; предварительно определенное имя потеряно.
Уровень | Числовое значение |
---|---|
CRITICAL |
50 |
ERROR |
40 |
WARNING |
30 |
INFO |
20 |
DEBUG |
10 |
NOTSET |
0 |
Объекты Handler¶
У обработчиков есть следующий атрибуты и методы. Обратите внимание, что
Handler
никогда не создается непосредственно; этот класс служит основой для
более полезных подклассов. Однако метод __init__()
в подклассы должен
вызывать Handler.__init__()
.
-
class
logging.
Handler
¶ -
__init__
(level=NOTSET)¶ Инициализирует
Handler
сущность, задав его уровень, установив список фильтров в пустой список и создав блокировку (используяcreateLock()
) для сериализации доступа к механизму I/O.
-
createLock
()¶ Инициализирует блокировку потока, который может быть используемый, чтобы преобразовать в последовательную форму доступ к лежанию в основе функциональности I/O, которая может не быть потокобезопасным.
-
acquire
()¶ Устанавливает блокировку потока, созданную с помощью
createLock()
.
-
setLevel
(level)¶ Устанавливает пороговое значение для этого обработчик level. Логирование сообщения, которые менее серьезны, чем level, будут проигнорированы. Когда обработчик создан, уровень установлен в
NOTSET
(который заставляет все сообщения быть обработанными).Список уровней см. в разделе Уровни логирования.
Изменено в версии 3.2: Параметр level теперь принимает представление строка уровня, такого как „INFO“ как альтернатива целочисленным константам, таким как
INFO
.
-
addFilter
(filter)¶ Добавляет указанный фильтр filter к этому обработчик.
-
removeFilter
(filter)¶ Удаляет указанный фильтр filter из этого обработчик.
-
filter
(record)¶ Примените фильтры этого обработчик к отчету и возвращает
True
, если отчет должен быть обработан. С фильтрами консультируются в свою очередь до одного из них возвращает ложный значение. Если ни один из них возвращает ложный значение, отчет будет испускаться. Если возвращает ложное значение, то обработчик не выдаст запись.
-
flush
()¶ Убедитесь, что все выходные данные логирования очищены. Эта версия ничего не делает и предназначена для реализации подклассы.
-
close
()¶ Приведите в порядок любые ресурсы, используемый обработчик. Эта версия не делает никакого вывода, но удаляет обработчик из внутреннего списка обработчики, который закрыт, когда
shutdown()
называют. Подклассы должны обеспечивать выполнение вызова из переопределенных методовclose()
.
-
handle
(record)¶ Условно испускает указанную запись логирование, в зависимости от фильтров, которые могли быть добавлены в обработчик. Завершение фактической эмиссии записи с получением/выпуском блокировки I/O поток.
-
handleError
(record)¶ Этот метод должен вызываться из обработчики при возникновении исключения во время вызова
emit()
. Если уровень модуля атрибутraiseExceptions
-False
, исключения тихо проигнорированы. Это то, что в основном требуется для системы логирование - большинство пользователей не будут заботиться об ошибках в системе логирование, их больше интересуют ошибки приложений. Однако при желании можно заменить это пользовательским обработчиком. Указанная запись обрабатывалась при возникновении исключения. (Дефолт, значениеraiseExceptions
-True
, поскольку это более полезно во время развития).
-
format
(record)¶ Форматирование записи - если задано форматирование, используйте его. В противном случае используйте форматер по умолчанию для модуля.
-
emit
(record)¶ Выполнить все необходимые действия для регистрации указанной записи логирование. Эта версия предназначена для реализации подклассы и поэтому вызывает
NotImplementedError
.
-
Список обработчики, включенных в качестве стандартных, см. в разделе logging.handlers
.
Объекты Formatter¶
Объекты Formatter
имеют следующие атрибуты и методы. Они отвечают за
преобразование LogRecord
в (обычно) строка, которые могут быть
интерпретированы либо человеком, либо внешней системой. Базовая Formatter
позволяет указать форматирование строка. Если ни один не поставляется,
дефолт, значение '%(message)s'
- используемый, который просто включает сообщение в
требование логирование. Чтобы иметь дополнительные элементы информации в
отформатированном выводе (например, отметку времени), продолжайте чтение.
Средство форматирования может быть инициализировано с форматом строка,
который использует знание LogRecord
атрибуты - такого как дефолт
значение, упомянутый выше использования того, что сообщение и аргументы
пользователя предварительно отформатированы в LogRecord
message атрибут.
Этот формат строка содержит стандартные ключи отображения %-стиля
Python. Дополнительные сведения о форматировании printf-стиль форматирования строк см. в разделе
строки.
Полезные ключи отображения в LogRecord
приведены в разделе LogRecord атрибуты.
-
class
logging.
Formatter
(fmt=None, datefmt=None, style='%')¶ Возвращает новую сущность класса
Formatter
. Сущность инициализируется форматной строкой для сообщения в целом, а также форматом строка для части даты/времени сообщения. Если fmt не указан,'%(message)s'
является используемый. Если не определен datefmt, формат - используемый, который описан в документацииformatTime()
.Параметр style может быть одним из «%», «{» или «$» и определяет, как формат строка будет объединяться с его данными: с помощью одного из % -форматирования,
str.format()
илиstring.Template
. Дополнительные сведения об использовании {- и $ -форматирования для сообщений журнала см. в разделе Использование определенных стилей форматирования в приложении.Изменено в версии 3.2: Добавлен параметр style.
Изменено в версии 3.8: Добавлен параметр validate. Неправильный или несоответствующий стиль и fmt вызовут
ValueError
. Например:logging.Formatter('%(asctime)s - %(message)s', style='{')
.-
format
(record)¶ Словарь отчета атрибут - используемый как операнд к операции по форматированию строки. Возвращает результирующий строку. Перед форматированием словаря проводится пара подготовительных этапов. message атрибут записи вычисляется с использованием msg*% *args. Если форматирование, строка содержит
'(asctime)'
,formatTime()
, называют, чтобы отформатировать время событий. Если имеется информация об исключении, она форматируется с помощьюformatException()
и добавляется к сообщению. Обратите внимание, что отформатированная информация об исключении кэшируется в файле атрибут exc_text. Это полезно, поскольку информация об исключениях может быть подана и отправлена по проводу, но следует быть осторожным, если имеется несколькоFormatter
подкласс, которые настраивают форматирование информации об исключениях. В этом случае вы должны будете очистить припрятавший про запас значение после того, как средство форматирования сделало свое форматирование, так, чтобы следующее средство форматирования, которое будет обращаться с событием, не использовало припрятавший про запас значение, но повторно вычислило его заново.Если информация о стеке доступна, она добавляется после информации об исключении, используя функцию
formatStack()
для ее преобразования при необходимости.
-
formatTime
(record, datefmt=None)¶ Этот метод должен вызываться из
format()
формататором, который хочет использовать отформатированное время. Этот метод можно переопределить в форматерах для обеспечения какого-либо конкретного требования, но основное поведение таково: если указан datefmt (a строка), то форматировать время создания записи используемый с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
(для добавления миллисекунды значение).
-
formatException
(exc_info)¶ Форматирует указанные сведения об исключении (стандартный кортеж исключений как возвращенный
sys.exc_info()
) как строка. В этой реализации по умолчанию используется толькоtraceback.print_exception()
. Результирующий строка является возвращенный.
-
formatStack
(stack_info)¶ Форматирует указанные сведения стека (строка как возвращенный по
traceback.print_stack()
, но с удалением последней новой строки) как строка. Это внедрение по умолчанию просто возвращает вход значение.
-
Объекты фильтра¶
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()
.
Хотя фильтры - используемый, прежде всего, чтобы отфильтровать отчеты на основе
более сложных критериев, чем уровни, они добираются, чтобы видеть каждый отчет,
который обработан обработчик или логгер, к которому они присоединены: это
может быть полезно, если вы хотите сделать вещи как подсчет, сколько отчетов
было обработано особым логгер или обработчик, или добавлением, изменением
или удалением атрибуты в обрабатываемом 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 – Имя логгер используемый для регистрации события, представленного этой LogRecord. Обратите внимание, что у этого имени всегда будет этот значение, даже при том, что это может быть испущено обработчиком, приложенным к другому (предоку) логгера.
- level – Числовой уровень события логирование (DEBUG, INFO и т.д.) Обратите внимание, что
он преобразуется в two атрибуты LogRecord:
levelno
для числового значение иlevelname
для соответствующего имени уровня. - pathname – Полный путь к файлу исходника, в котором был выполнен вызов логирования.
- lineno – Номер строки в исходном файле, в котором был выполнен вызов логирования.
- msg – Сообщение описания события, возможно формат строка с местозаполнителями для переменных данных.
- args – Переменные данные для объединения в аргумент msg для получения описания события.
- exc_info – Кортеж исключений с текущей информацией об исключении или
None
, если сведения об исключении отсутствуют. - func – Имя функции или метода, из которого был вызван вызов логирования.
- sinfo – Текстовая строка, представляющая информацию стека из базы стека в текущем потоке, вплоть до вызова логирования.
-
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 атрибуты.) эти атрибуты могут быть используемый, чтобы слить данные из отчета в формат строка. В следующей таблице перечислены (в алфавитном порядке) имена атрибут, их значения и соответствующие местозаполнители в формате% -style строка.
Если вы используете {} - форматирующий (str.format()
), вы можете использовать
{attrname}
в качестве заполнителя в формате строка. Если используется $
-форматирование (string.Template
), используйте форму ${attrname}
. В обоих случаях,
конечно, замените attrname
на фактическое имя атрибут, которое требуется
использовать.
В случае {} - форматирование, вы можете определить флаги форматирования,
разместив их после имени атрибут, отделенного от него с двоеточием.
Например: заполнитель {msecs:03d}
отформатировал бы миллисекунду значение
4
как 004
. Обратитесь к документации str.format()
для полного
изложения на вариантах, доступных вам.
Имя атрибута | Формат | Описание |
---|---|---|
args | Вам не нужно форматировать его самостоятельно. | Кортеж аргументов слился в msg , чтобы
произвести message или словарь, значения
которого используются для слияния (когда есть
только один аргумент, и это словарь). |
asctime | %(asctime)s |
Читаемое человеком время создания
LogRecord . По умолчанию это имеет вид
„2003-07-08 16:49: 45,896“ (числа после запятой
являются миллисекундной частью
времени). |
created | %(created)f |
Время, когда LogRecord был создан
(как возвращенный time.time() ). |
exc_info | Вам не нужно форматировать его самостоятельно. | Кортеж исключения (в духе``sys.exc_info``) или,
если не произошло исключения, None . |
filename | %(filename)s |
Filename части pathname . |
funcName | %(funcName)s |
Имя функции, содержащей вызов логирования. |
levelname | %(levelname)s |
Текстовый уровень логирования для сообщения
('DEBUG' , 'INFO' , 'WARNING' ,
'ERROR' , 'CRITICAL' ). |
levelno | %(levelno)s |
Числовой уровень логирование для сообщения
(DEBUG , INFO ,
WARNING , ERROR ,
CRITICAL ). |
lineno | %(lineno)d |
Номер строки исходника, из которой был зделан вызов логирования (если доступен). |
message | %(message)s |
Зарегистрированное сообщение, вычисленное как
msg % args . Этот параметр устанавливается
при вызове функции «Formatter.format() ». |
module | %(module)s |
Модуль (часть имени filename ). |
msecs | %(msecs)d |
|
msg | Вам не нужно форматировать его самостоятельно. | Форматная строка переданная в исходном вызове
логирования. Слитый с args , чтобы произвести
message или произвольный объект (см.
Использование произвольных объектов в качестве сообщений). |
name | %(name)s |
Имя логгера используемого для регистрации вызова. |
pathname | %(pathname)s |
Полное имя пути к исходному файлу, в котором был выполнен вызов логирования (если доступно). |
process | %(process)d |
ID процесса (если доступен). |
processName | %(processName)s |
Имя процесса (если доступен). |
relativeCreated | %(relativeCreated)d |
Время в миллисекундах при создании LogRecord относительно времени загрузки модуля logging. |
stack_info | Вам не нужно форматировать это самостоятельно. | Информация о стековом кадре (если таковая имеется) из нижней части стека в текущем потоке, вплоть до стекового фрейма вызова регистрации, который привел к созданию этой записи. |
thread | %(thread)d |
ID потока (если доступен). |
threadName | %(threadName)s |
Имя потока (если доступно). |
Изменено в версии 3.1: processName был добавлен.
Объекты LoggerAdapter¶
LoggerAdapter
сущности - используемый, чтобы удобно передать контекстную
информацию в вызов логирования. Для примера использования посмотрите раздел
добавление контекстной информации в выходные данные логирования.
-
class
logging.
LoggerAdapter
(logger, extra)¶ Возвращает сущность
LoggerAdapter
, инициализированный с помощью нижележащего объектаLogger
сущность и словареподобного объекта.-
process
(msg, kwargs)¶ Изменяет сообщение и/или аргументы ключевой, переданные вызову логирование, чтобы вставить контекстную информацию. Эта реализация принимает объект, переданный конструктору как extra, и добавляет его к kwargs с помощью ключа «extra». возвращает значение - кортеж (msg, kwargs), содержащий (возможно измененные) версии переданных аргументов.
-
В дополнение к вышеупомянутому LoggerAdapter
поддерживает следующие методы
Logger
: debug()
, info()
, warning()
,
error()
, exception()
,
critical()
, log()
, isEnabledFor()
,
getEffectiveLevel()
, setLevel()
и hasHandlers()
.
Эти методы имеют те же подписи, что и их аналоги в Logger
, поэтому можно
использовать два типа сущности взаимозаменяемо.
Изменено в версии 3.2: Методы isEnabledFor()
, getEffectiveLevel()
, setLevel()
и hasHandlers()
были добавлены к
LoggerAdapter
. Эти методы делегируются базовому логгеру.
Потоковая безопасность¶
Модуль логирование предназначен для потокобезопасной без какой-либо специальной работы, которую должны выполнять его клиенты. Это достигается с помощью многопоточных блокировок; есть один замок, чтобы преобразовать в последовательную форму доступ к совместно используемым данным модуля, и каждый обработчик также создает замок, чтобы преобразовать в последовательную форму доступ к его основному I/O.
Если вы реализуете асинхронный сигнал обработчики с помощью модуля signal
,
вы можете быть не в состоянии использовать логирование из таких обработчики. Это
связано с тем, что реализации блокировок в модуле threading
не всегда являются
повторно входящими и поэтому не могут быть вызваны из такого сигнала
обработчики.
Функции уровня модуля¶
Помимо описанных выше классов, существует ряд функций уровня модуля.
-
logging.
getLogger
(name=None)¶ Возвращает логгер с указанным именем или, если имя -
None
, возвращает логгер, который является корневым логгером иерархии. Если указано, имя обычно является иерархическим именем, разделенным точками, таким как „a“, „a.b“ или „a.b.c.d“. Выбор этих имен полностью зависит от разработчика, который использует логирование.Все вызовы этой функции с заданным именем возвращает одинаковый логгер сущность. Это означает, что логгер сущности никогда не должен передаваться между различными частями применения.
-
logging.
getLoggerClass
()¶ Возвращает либо стандартный класс
Logger
, либо последний класс, переданныйsetLoggerClass()
. Эта функция может быть вызвана из нового определения класса, чтобы гарантировать, что установка настроенного классаLogger
не отменит настройки, уже примененные другим код. Например:class MyLogger(logging.getLoggerClass()): # ... переопределить поведение здесь
-
logging.
getLogRecordFactory
()¶ Возвращает вызываемое, которое используется, для создания
LogRecord
.Добавлено в версии 3.2: Эта функция была предусмотрена, вместе с
setLogRecordFactory()
, чтобы предоставить разработчикам больше контроля над тем, как строитсяLogRecord
, представляющее событие логирование.Дополнительные сведения о вызове фабрики см. в разделе
setLogRecordFactory()
.
-
logging.
debug
(msg, *args, **kwargs)¶ Регистрирует сообщение с уровнем
DEBUG
на корне логгер. msg является форматом сообщения строка, а args - аргументами, объединяемыми в msg с помощью оператора форматирования строка. (Обратите внимание, что это означает, что ключевые слова можно использовать в формате строка вместе с одним аргументом словаря.)В kwargs есть три аргумента ключевой, которые проверяются: exc_info которые, если они не оцениваются как ложные, вызывают добавление информации об исключении в сообщение логирование. Если предусмотрен кортеж исключений (в формате возвращенный по
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):
, которая является используемый при отображении фреймов исключений.Третий дополнительный аргумент ключевой - extra, который может быть используемый, чтобы передать словарь, который является используемый, чтобы заполнить __dict__
LogRecord
, созданного для события логирование с определенным пользователями атрибуты. Эти пользовательские атрибуты могут быть используемый, как вы хотите. Например, они могут быть включены в зарегистрированные сообщения. Например:FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s' logging.basicConfig(format=FORMAT) d = {'clientip': '192.168.0.1', 'user': 'fbloggs'} logging.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, не должны сталкиваться с ключами используемый системой логирование. (См. документацию
Formatter
, для получения дополнительной информации о которой ключи - используемый системой логирование.)Если вы принимаете решение использовать эти атрибуты в зарегистрированных сообщениях, вы должны проявить некоторую заботу. В вышеприведенном примере, для сущность,
Formatter
был настроен в формате строка, который ожидает „clientip“ и „user“ в словаре атрибут LogRecord. Если они отсутствуют, сообщение не будет записано в журнал, так как произойдет исключение форматирования строка. Так что в этом случае всегда нужно передать словарь extra с этими ключами.В то время как это могло бы быть раздражающим, эта особенность предназначена для использования при специализированных обстоятельствах, таких как многопоточные серверы, где тот же код выполняет во многих контекстах, и интересные условия, которые возникают, зависят от этого контекст (такого как удаленный IP-адрес клиента и заверенное имя пользователя в вышеупомянутом примере). В таких обстоятельствах, вероятно, специализированный
Formatter
будет используемый с конкретнымHandler
.Изменено в версии 3.2: Добавлен параметр stack_info.
-
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()
.Примечание
Вышеуказанные удобные функции уровня модуля, которые делегируют корневой логгер, вызовите
basicConfig()
для обеспечения доступности хотя бы одного обработчик. Из-за этого они должны не быть используемый в потоки в версиях Python ранее, чем 2.7.1 и 3.2, если по крайней мере один обработчик не был добавлен к логгеру перед корнем, потоки начаты. В более ранних версиях Python, из-за недостатка безопасности поток вbasicConfig()
, это может (при редких обстоятельствах) лидерство к обработчики, добавляемому многократно к корню логгер, который может в свою очередь привести к нескольким сообщениям для того же события.
-
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.
getLevelName
(level)¶ Возвращает текстовое представление уровня логирование level. Если уровень - один из предопределенных уровней
CRITICAL
,ERROR
,WARNING
,INFO
илиDEBUG
тогда, вы получаете соответствующий строка. Если уровни связаны с именами с помощьюaddLevelName()
, то имя, связанное с level, равно возвращенный. Если числовой значение, соответствующий одному из определенных уровней, передан в, соответствующее представление строка - возвращенный. Иначе строка „Уровень %s“ уровень % является возвращенный.Примечание
Уровни внутренне целые (так как их нужно сравнивать в логике логирования). Эта функция - используемый, чтобы преобразовать между целочисленным уровнем и именем уровня, показанным в отформатированного вывода регистрации посредством спецификатора формата
%(levelname)s
(см. LogRecord атрибуты).Изменено в версии 3.4: В версиях Python ранее 3.4 эта функция также может быть передана текстовый уровень, и будет возвращать соответствующее числовое значение уровня. Это недокументированное поведение было сочтено ошибкой и было удалено в Python 3.4, но восстановлен в 3.4.2 из-за сохранения обратной совместимости.
-
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, если эта функция вызывается из нескольких потоки, возможно (в редких случаях), что обработчик будет добавлен в корневой логгер более одного раза, что приведет к неожиданным результатам, таким как дублирование сообщений в журнале.
Поддерживаются следующие аргументы ключевой.
Формат Описание filename Указывает, что FileHandler должен создаваться с использованием указанного имени файла, а не StreamHandler. filemode Если filename определен, открыть файл n этим режимом. По умолчанию используется значение 'a'
.format Использовать указанную форматную строка для обработчика. datefmt Использовать указанный формат даты и времени, принятый time.strftime()
.style Если задан параметр format, использовать этот стиль для формата строки. Один из '%'
,'{'
или'$'
для printf-стиль,str.format()
илиstring.Template
соответственно. По умолчанию используется значение'%'
.level Установить уровень корневого логгера на указанный уровень. stream Использовать указанный поток для инициализации StreamHandler. Обратите внимание, что этот аргумент несовместим с filename - если присутствуют оба, поднимается ValueError
.handlers Если указан, он должен быть итератором уже созданных обработчиков для добавления к корневому логгеру. Любые обработчики, которым не установлен форматтер, назначатся форматтер по умолчанию, созданное в этой функции. Обратите внимание, что этот аргумент несовместим с filename или stream - если они присутствуют, поднимается ValueError
.force Если этот ключевой аргумент указан как true, все существующие обработчики, присоединенные к корневому логгеру, удаляются и закрываются перед выполнением конфигурации, указанной другими аргументами. Изменено в версии 3.2: Добавлен аргумент style.
Изменено в версии 3.3: Добавлен аргумент handlers. Дополнительные проверки были добавлены, чтобы поймать ситуации, где несовместимые аргументы определены (например, handlers вместе с stream или filename или stream вместе с filename).
Изменено в версии 3.8: Добавлен аргумент force.
-
logging.
shutdown
()¶ Информирует систему логирование о необходимости упорядоченного останова путем промывки и закрытия всех обработчики. Это должно быть вызвано при выходе из приложения, и после этого вызова не следует использовать систему логирование.
Когда модуль логирование импортирован, он регистрирует эту функцию как выход обработчик (см.
atexit
), поэтому обычно нет никакой потребности сделать это вручную.
-
logging.
setLoggerClass
(klass)¶ Предписывает логирование системе использовать класс klass при создании экземпляра логгер. Класс должен определять
__init__()
таким образом, чтобы требовался только аргумент имени, а__init__()
должен вызыватьLogger.__init__()
. Эта функция, как правило, вызывается, прежде чем любые логгеры иллюстрируются примерами заявлениями, которые должны использовать пользовательское поведение логгер. После этого требования, как в любое другое время, не иллюстрируют примерами логгеры, непосредственно используя подкласс: продолжите использоватьlogging.getLogger()
API, чтобы получить ваш логгеры.
-
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: Полный путь к файлу, в который был сделан вызов logging. lno: Номер строки в файле, где был сделан вызов logging. msg: Сообщение журнала. args: Аргументы для сообщения журналирования. exc_info: Кортеж исключений или None
.func: Имя функции или метода, которая вызвала logging. sinfo: Трассировка стека, такая как предоставляется traceback.print_stack()
, показывая иерархию вызовов.kwargs: Дополнительные ключевые аргументы.
Атрибуты уровня модуля¶
-
logging.
lastResort
¶ «Обработчик последней инстанции» доступен через этот атрибут. Это -
StreamHandler
, пишущийsys.stderr
с уровнемWARNING
, и является используемый, чтобы обращаться с событиями логирование в отсутствие любой конфигурации логирование. Конечный результат - просто распечатать сообщение дляsys.stderr
. Это заменяет предыдущее сообщение об ошибке, в котором говорится, что «не удалось найти обработчики для логгера XYZ». Если вам нужно более раннее поведение по какой-то причине,lastResort
можно установить вNone
.Добавлено в версии 3.2.
Интеграция с модулем warnings¶
Функция captureWarnings()
может быть используемый, чтобы объединить logging
с
модулем warnings
.
-
logging.
captureWarnings
(capture)¶ Эта функция - используемый, чтобы повернуть захват предупреждений логирование на и прочь.
Если capture будет
True
, то предупреждения, выпущенные модулемwarnings
, будут перенаправлены к системе логирование. В частности, предупреждение будет отформатировано с использованиемwarnings.formatwarning()
и результирующего строка, зарегистрированного в логгер с именем'py.warnings'
со степенью серьезностиWARNING
.Если capture будет
False
, то переназначение предупреждений системе логирование остановится, и предупреждения будут перенаправлены к их оригинальным местам назначения (т.е. они в действительности, прежде чем вызывалсяcaptureWarnings(True)
).
См.также
- Модуль
logging.config
- Конфигурационное API для модуля logging.
- Модуль
logging.handlers
- Полезные обработчики, входящие в состав модуля logging.
- PEP 282 - система логирования
- Предложение, описывающее эту функцию для включения в стандартную библиотеку Python.
- Оригинальный пакет logging Python
- Это исходный исходник для пакета
logging
. Версия пакета, доступная с этого сайта, подходит для использования с Python 1.5.2, 2.1.x и 2.2.x, которые не включают пакетlogging
в стандартную библиотеку.