logging.handlers
— Обработчики логов¶
Исходный код: Lib/logging/handlers.py.
В пакете предусмотрены следующие полезные обработчики. Обратите внимание, что три из них (StreamHandler
, FileHandler
и NullHandler
) на самом деле определены в самом модуле logging
, но были задокументированы здесь вместе с другими обработчиками.
StreamHandler¶
Класс StreamHandler
, расположенный в пакете core logging
, отправляет вывод журнала в такие потоки, как sys.stdout, sys.stderr или любой файлоподобный объект (точнее, любой объект, поддерживающий методы write()
и flush()
).
-
class
logging.
StreamHandler
(stream=None)¶ Возвращает новый экземпляр класса
StreamHandler
. Если указан stream, экземпляр будет использовать его для вывода логов; в противном случае будет использоваться sys.stderr.-
emit
(record)¶ Если указан форматтер, то он используется для форматирования записи. Затем запись записывается в поток, за которым следует
terminator
. Если присутствует информация об исключении, она форматируется с помощьюtraceback.print_exception()
и добавляется в поток.
-
flush
()¶ Промывает поток, вызывая его метод
flush()
. Обратите внимание, что методclose()
наследуется отHandler
и поэтому не делает никакого вывода, поэтому иногда может потребоваться явный вызовflush()
.
-
setStream
(stream)¶ Устанавливает поток экземпляра на указанное значение, если оно отличается. Старый поток очищается перед установкой нового потока.
- Parameters
stream – Поток, который должен использовать обработчик.
- Result
старый поток, если поток был изменен, или None, если не был.
Добавлено в версии 3.7.
-
terminator
¶ Строка, используемая в качестве терминатора при записи форматированной записи в поток. Значение по умолчанию -
'\n'
.Если вам не нужно завершение новой строки, вы можете установить атрибут
terminator
экземпляра обработчика на пустую строку.В предыдущих версиях терминатор был жестко закодирован как
'\n'
.Добавлено в версии 3.2.
-
FileHandler¶
Класс FileHandler
, расположенный в основном пакете logging
, отправляет вывод журнала в дисковый файл. Он наследует функциональность вывода от StreamHandler
.
-
class
logging.
FileHandler
(filename, mode='a', encoding=None, delay=False, errors=None)¶ Возвращает новый экземпляр класса
FileHandler
. Указанный файл открывается и используется в качестве потока для протоколирования. Если mode не указан, то используется'a'
. Если encoding не являетсяNone
, то используется открытие файла с этой кодировкой. Если delay равно true, то открытие файла откладывается до первого вызоваemit()
. По умолчанию файл растет неограниченно. Если указано errors, то оно используется для определения того, как обрабатываются ошибки кодировки.Изменено в версии 3.6: Помимо строковых значений, в качестве аргумента filename принимаются объекты
Path
.Изменено в версии 3.9: Был добавлен параметр errors.
-
close
()¶ Закрывает файл.
-
NullHandler¶
Добавлено в версии 3.1.
Класс NullHandler
, расположенный в основном пакете logging
, не выполняет никакого форматирования или вывода. По сути, это обработчик «no-op» для использования разработчиками библиотек.
-
class
logging.
NullHandler
¶ Возвращает новый экземпляр класса
NullHandler
.-
emit
(record)¶ Этот метод ничего не делает.
-
handle
(record)¶ Этот метод ничего не делает.
-
createLock
()¶ Этот метод возвращает
None
для блокировки, поскольку нет базового ввода/вывода, к которому необходимо сериализовать доступ.
-
Более подробную информацию о том, как использовать Настройка ведения журнала для библиотеки, смотрите в разделе NullHandler
.
WatchedFileHandler¶
Класс WatchedFileHandler
, расположенный в модуле logging.handlers
, представляет собой FileHandler
, который следит за файлом, в который ведется журнал. Если файл изменяется, он закрывается и открывается снова, используя имя файла.
Изменение файла может произойти из-за использования таких программ, как newsyslog и logrotate, которые выполняют ротацию файлов журнала. Этот обработчик, предназначенный для использования под Unix/Linux, следит за файлом, чтобы узнать, не изменился ли он с момента последнего выброса. (Считается, что файл изменился, если изменилось его устройство или inode.) Если файл изменился, старый поток файла закрывается, а файл открывается для получения нового потока.
Этот обработчик не подходит для использования под Windows, поскольку под Windows открытые файлы журналов нельзя перемещать или переименовывать - журналирование открывает файлы с помощью эксклюзивных блокировок - и поэтому нет необходимости в таком обработчике. Кроме того, ST_INO не поддерживается под Windows; stat()
всегда возвращает ноль для этого значения.
-
class
logging.handlers.
WatchedFileHandler
(filename, mode='a', encoding=None, delay=False, errors=None)¶ Возвращает новый экземпляр класса
WatchedFileHandler
. Указанный файл открывается и используется в качестве потока для протоколирования. Если mode не указан, то используется'a'
. Если encoding не являетсяNone
, то используется открытие файла с этой кодировкой. Если delay равно true, то открытие файла откладывается до первого вызоваemit()
. По умолчанию файл растет неограниченно. Если задано значение errors, то оно определяет, как будут обрабатываться ошибки кодирования.Изменено в версии 3.6: Помимо строковых значений, в качестве аргумента filename принимаются объекты
Path
.Изменено в версии 3.9: Был добавлен параметр errors.
-
reopenIfNeeded
()¶ Проверяет, не изменился ли файл. Если изменился, то существующий поток промывается и закрывается, а файл открывается снова, обычно это предшествует выводу записи в файл.
Добавлено в версии 3.6.
-
emit
(record)¶ Выводит запись в файл, но сначала вызывает
reopenIfNeeded()
для повторного открытия файла, если он изменился.
-
BaseRotatingHandler¶
Класс BaseRotatingHandler
, расположенный в модуле logging.handlers
, является базовым классом для обработчиков вращающихся файлов RotatingFileHandler
и TimedRotatingFileHandler
. Вам не нужно инстанцировать этот класс, но у него есть атрибуты и методы, которые вы можете переопределить.
-
class
logging.handlers.
BaseRotatingHandler
(filename, mode, encoding=None, delay=False, errors=None)¶ Параметры как для
FileHandler
. Атрибутами являются:-
namer
¶ Если этот атрибут установлен для вызываемого объекта, то метод
rotation_filename()
делегируется этому вызываемому объекту. Параметры, передаваемые в вызываемый метод, являются параметрами, передаваемыми вrotation_filename()
.Примечание
Функция namer вызывается довольно много раз во время ролловера, поэтому она должна быть максимально простой и быстрой. Она также должна возвращать один и тот же результат каждый раз для заданного входа, иначе поведение ролловера может работать не так, как ожидается.
Также стоит отметить, что при использовании именователя следует позаботиться о сохранении определенных атрибутов в имени файла, которые используются при ротации. Например,
RotatingFileHandler
ожидает иметь набор файлов журнала, имена которых содержат последовательные целые числа, так что ротация работает как ожидается, аTimedRotatingFileHandler
удаляет старые файлы журнала (на основе параметраbackupCount
, переданного инициализатору обработчика), определяя самые старые файлы для удаления. Чтобы это произошло, имена файлов должны быть отсортированы с использованием части даты/времени в имени файла, и именователь должен это соблюдать. (Если нужен именователь, не соблюдающий эту схему, его нужно будет использовать в подклассеTimedRotatingFileHandler
, который переопределит методgetFilesToDelete()
, чтобы он соответствовал пользовательской схеме именования).Добавлено в версии 3.3.
-
rotator
¶ Если этот атрибут установлен для вызываемого объекта, то метод
rotate()
делегируется этому вызываемому объекту. Параметры, передаваемые в вызываемый метод, являются параметрами, передаваемыми вrotate()
.Добавлено в версии 3.3.
-
rotation_filename
(default_name)¶ Изменение имени файла журнала при вращении.
Это предусмотрено для того, чтобы можно было указать пользовательское имя файла.
Реализация по умолчанию вызывает атрибут „namer“ обработчика, если он является вызываемым, передавая ему имя по умолчанию. Если атрибут не является вызываемым (по умолчанию
None
), имя возвращается без изменений.- Parameters
default_name – Имя по умолчанию для файла журнала.
Добавлено в версии 3.3.
-
rotate
(source, dest)¶ При вращении вращайте текущий журнал.
Реализация по умолчанию вызывает атрибут „rotator“ обработчика, если он вызываемый, передавая ему аргументы source и dest. Если атрибут не вызывается (по умолчанию
None
), источник просто переименовывается в место назначения.- Parameters
source – Имя исходного файла. Обычно это имя базового файла, например, „test.log“.
dest – Имя конечного файла. Обычно это то, во что разворачивается источник, например, „test.log.1“.
Добавлено в версии 3.3.
-
Атрибуты существуют для того, чтобы избавить вас от необходимости создавать подкласс - вы можете использовать одни и те же вызываемые элементы для экземпляров RotatingFileHandler
и TimedRotatingFileHandler
. Если при вызове namer или rotator возникает исключение, оно обрабатывается так же, как и любое другое исключение при вызове emit()
, т.е. через метод handleError()
обработчика.
Если вам необходимо внести более существенные изменения в обработку вращения, вы можете переопределить эти методы.
В качестве примера смотрите Использование ротатора и именователя для настройки обработки вращения журнала.
RotatingFileHandler¶
Класс RotatingFileHandler
, расположенный в модуле logging.handlers
, поддерживает ротацию файлов дискового журнала.
-
class
logging.handlers.
RotatingFileHandler
(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)¶ Возвращает новый экземпляр класса
RotatingFileHandler
. Указанный файл открывается и используется в качестве потока для протоколирования. Если mode не указан, то используется'a'
. Если encoding не являетсяNone
, то используется открытие файла с этой кодировкой. Если delay равно true, то открытие файла откладывается до первого вызоваemit()
. По умолчанию файл растет неограниченно. Если задано значение errors, то оно определяет, как будут обрабатываться ошибки кодирования.Вы можете использовать значения maxBytes и backupCount, чтобы позволить файлу rollover при заданном размере. Когда размер будет превышен, файл будет закрыт и новый файл будет тихо открыт для вывода. Переход происходит всякий раз, когда текущий файл журнала имеет длину почти maxBytes; но если maxBytes или backupCount равны нулю, переход никогда не произойдет, поэтому обычно нужно установить backupCount по крайней мере в 1, а maxBytes иметь ненулевым. Когда backupCount ненулевой, система будет сохранять старые файлы журналов, добавляя к имени файла расширения „.1“, „.2“ и т.д. Например, при backupCount равном 5 и базовом имени файла
app.log
, вы получитеapp.log
,app.log.1
,app.log.2
, вплоть доapp.log.5
. Файл, в который производится запись, всегдаapp.log
. Когда этот файл заполняется, он закрывается и переименовывается вapp.log.1
, а если существуют файлыapp.log.1
,app.log.2
и т.д., то они переименовываются вapp.log.2
,app.log.3
и т.д. соответственно.Изменено в версии 3.6: Помимо строковых значений, в качестве аргумента filename принимаются объекты
Path
.Изменено в версии 3.9: Был добавлен параметр errors.
-
doRollover
()¶ Выполняет переворачивание, как описано выше.
-
emit
(record)¶ Выводит запись в файл, обслуживая перенос, как описано ранее.
-
TimedRotatingFileHandler¶
Класс TimedRotatingFileHandler
, расположенный в модуле logging.handlers
, поддерживает ротацию файлов дискового журнала через определенные временные интервалы.
-
class
logging.handlers.
TimedRotatingFileHandler
(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)¶ Возвращает новый экземпляр класса
TimedRotatingFileHandler
. Указанный файл открывается и используется в качестве потока для протоколирования. При ротации он также устанавливает суффикс имени файла. Ротация происходит на основе произведения when и interval.Вы можете использовать when для указания типа интервала. Список возможных значений приведен ниже. Обратите внимание, что они не чувствительны к регистру.
Значение
Тип интервала
Если/как используется atTime
'S'
Секунды
Игнорируется
'M'
Протоколы
Игнорируется
'H'
Часы
Игнорируется
'D'
Дни
Игнорируется
'W0'-'W6'
День недели (0=понедельник)
Используется для вычисления начального времени переворачивания
'midnight'
Перевернуть в полночь, если atTime не указано, иначе в момент atTime.
Используется для вычисления начального времени переворачивания
При использовании ротации по дням недели укажите „W0“ для понедельника, „W1“ для вторника и так далее до „W6“ для воскресенья. В этом случае значение, переданное для интервала, не используется.
Система сохраняет старые файлы журнала, добавляя расширения к имени файла. Расширения основаны на дате и времени, используют формат strftime
%Y-%m-%d_%H-%M-%S
или его ведущую часть, в зависимости от интервала переноса.При вычислении времени следующего поворота в первый раз (при создании обработчика) для вычисления времени следующего поворота используется время последней модификации существующего файла журнала или текущее время.
Если аргумент utc равен true, будет использоваться время в UTC; в противном случае используется местное время.
Если backupCount ненулевое, будет сохранено не более backupCount файлов, и если при переносе будет создано больше файлов, самый старый из них будет удален. Логика удаления использует интервал, чтобы определить, какие файлы удалять, поэтому изменение интервала может оставить старые файлы лежать вокруг.
Если delay равно true, то открытие файла откладывается до первого вызова
emit()
.Если atTime не
None
, то это должен быть экземплярdatetime.time
, который указывает время суток, когда происходит перенос, для случаев, когда перенос установлен «в полночь» или «в определенный будний день». Обратите внимание, что в этих случаях значение atTime фактически используется для расчета первичного переноса, а последующие переносы будут рассчитываться с помощью обычного расчета интервала.Если указано errors, оно используется для определения того, как будут обрабатываться ошибки кодирования.
Примечание
Расчет начального времени опрокидывания выполняется при инициализации обработчика. Расчет последующих времен перевертывания выполняется только при перевертывании, а перевертывание происходит только при выдаче вывода. Если об этом не помнить, это может привести к некоторой путанице. Например, если задан интервал «каждую минуту», это не означает, что вы всегда будете видеть файлы журнала с временем (в имени файла), разделенным минутой; если во время выполнения приложения вывод журнала генерируется чаще, чем раз в минуту, то вы можете ожидать увидеть файлы журнала с временем, разделенным минутой. С другой стороны, если сообщения журнала выводятся только раз в пять минут (скажем), то в файлах будут пробелы, соответствующие минутам, в течение которых не было вывода (и, следовательно, переноса).
Изменено в версии 3.4: Был добавлен параметр atTime.
Изменено в версии 3.6: Помимо строковых значений, в качестве аргумента filename принимаются объекты
Path
.Изменено в версии 3.9: Был добавлен параметр errors.
-
doRollover
()¶ Выполняет переворачивание, как описано выше.
-
emit
(record)¶ Выводит запись в файл, обслуживая перенос, как описано выше.
-
getFilesToDelete
()¶ Возвращает список имен файлов, которые должны быть удалены в процессе переноса. Это абсолютные пути самых старых файлов журнала резервного копирования, записанных обработчиком.
-
SocketHandler¶
Класс SocketHandler
, расположенный в модуле logging.handlers
, отправляет вывод журнала в сетевой сокет. Базовый класс использует сокет TCP.
-
class
logging.handlers.
SocketHandler
(host, port)¶ Возвращает новый экземпляр класса
SocketHandler
, предназначенный для связи с удаленной машиной, адрес которой задан host и port.Изменено в версии 3.4: Если
port
указано какNone
, создается сокет домена Unix, используя значение вhost
- в противном случае создается сокет TCP.-
close
()¶ Закрывает гнездо.
-
emit
()¶ Выбирает словарь атрибутов записи и записывает его в сокет в двоичном формате. Если произошла ошибка с сокетом, молча отбрасывает пакет. Если соединение было ранее потеряно, восстанавливает соединение. Чтобы распаковать запись на принимающей стороне в
LogRecord
, используйте функциюmakeLogRecord()
.
-
handleError
()¶ Обрабатывает ошибку, возникшую во время
emit()
. Наиболее вероятной причиной является потеря соединения. Закрывает сокет, чтобы мы могли повторить попытку при следующем событии.
-
makeSocket
()¶ Это фабричный метод, который позволяет подклассам определить точный тип сокета, который они хотят. Реализация по умолчанию создает сокет TCP (
socket.SOCK_STREAM
).
-
makePickle
(record)¶ Выбирает словарь атрибутов записи в двоичном формате с префиксом длины и возвращает его готовым к передаче через сокет. Детали этой операции эквивалентны:
data = pickle.dumps(record_attr_dict, 1) datalen = struct.pack('>L', len(data)) return datalen + data
Обратите внимание, что огурцы не являются полностью безопасными. Если вы беспокоитесь о безопасности, вы можете переопределить этот метод, чтобы реализовать более безопасный механизм. Например, вы можете подписывать пикели с помощью HMAC и затем проверять их на принимающей стороне, или, в качестве альтернативы, вы можете отключить распикировку глобальных объектов на принимающей стороне.
-
send
(packet)¶ Отправка травленой байт-строки пакет в сокет. Формат отправляемой байт-строки описан в документации для
makePickle()
.Эта функция позволяет осуществлять частичную отправку, что может произойти, когда сеть занята.
-
createSocket
()¶ Пытается создать сокет; при неудаче использует экспоненциальный алгоритм отката. При первом сбое обработчик отбрасывает сообщение, которое он пытался отправить. Когда последующие сообщения обрабатываются тем же экземпляром, он не будет пытаться подключиться, пока не пройдет некоторое время. Параметры по умолчанию таковы, что начальная задержка составляет одну секунду, и если после этой задержки соединение все еще не может быть установлено, обработчик будет удваивать задержку каждый раз до максимального значения в 30 секунд.
Это поведение контролируется следующими атрибутами обработчика:
retryStart
(начальная задержка, по умолчанию 1,0 секунды).retryFactor
(множитель, по умолчанию 2,0).retryMax
(максимальная задержка, по умолчанию 30,0 секунд).
Это означает, что если удаленный слушатель запустится после использования обработчика, вы можете потерять сообщения (поскольку обработчик не будет даже пытаться установить соединение до истечения задержки, а просто будет молча отбрасывать сообщения в течение периода задержки).
-
DatagramHandler¶
Класс DatagramHandler
, расположенный в модуле logging.handlers
, наследуется от SocketHandler
для поддержки отправки сообщений протоколирования через UDP сокеты.
-
class
logging.handlers.
DatagramHandler
(host, port)¶ Возвращает новый экземпляр класса
DatagramHandler
, предназначенный для связи с удаленной машиной, адрес которой задан host и port.Изменено в версии 3.4: Если
port
указано какNone
, создается сокет домена Unix, используя значение вhost
- в противном случае создается сокет UDP.-
emit
()¶ Выбирает словарь атрибутов записи и записывает его в сокет в двоичном формате. Если в сокете возникла ошибка, пакет молча отбрасывается. Чтобы распаковать запись на принимающей стороне в
LogRecord
, используйте функциюmakeLogRecord()
.
-
makeSocket
()¶ Метод фабрики
SocketHandler
здесь переопределен для создания UDP сокета (socket.SOCK_DGRAM
).
-
send
(s)¶ Отправка травленой байтовой строки в сокет. Формат отправляемой байт-строки соответствует описанию в документации для
SocketHandler.makePickle()
.
-
SysLogHandler¶
Класс SysLogHandler
, расположенный в модуле logging.handlers
, поддерживает отправку сообщений протоколирования в удаленный или локальный Unix syslog.
-
class
logging.handlers.
SysLogHandler
(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM)¶ Возвращает новый экземпляр класса
SysLogHandler
, предназначенный для связи с удаленной Unix-машиной, адрес которой задан address в виде кортежа(host, port)
. Если address не указан, то используется('localhost', 514)
. Адрес используется для открытия сокета. Альтернативой предоставлению кортежа(host, port)
является предоставление адреса в виде строки, например, „/dev/log“. В этом случае для отправки сообщения в syslog используется сокет домена Unix. Если facility не указан, используетсяLOG_USER
. Тип открываемого сокета зависит от аргумента socktype, который по умолчанию равенsocket.SOCK_DGRAM
и открывает сокет UDP. Чтобы открыть TCP-сокет (для использования с новыми демонами syslog, такими как rsyslog), укажите значениеsocket.SOCK_STREAM
.Обратите внимание, что если ваш сервер не прослушивает UDP-порт 514, может оказаться, что
SysLogHandler
не работает. В этом случае проверьте, какой адрес вы должны использовать для сокета домена - это зависит от системы. Например, в Linux это обычно „/dev/log“, а в OS/X - „/var/run/syslog“. Вам нужно проверить вашу платформу и использовать соответствующий адрес (возможно, вам придется делать эту проверку во время выполнения, если ваше приложение должно работать на нескольких платформах). В Windows практически необходимо использовать опцию UDP.Изменено в версии 3.2: Был добавлен socktype.
-
close
()¶ Закрывает сокет к удаленному хосту.
-
emit
(record)¶ Запись форматируется, а затем отправляется на сервер syslog. Если присутствует информация об исключении, она не отправляется на сервер.
Изменено в версии 3.2.1: (См.: bpo-12168.) В ранних версиях сообщение, отправляемое демонам syslog, всегда завершалось байтом NUL, потому что ранние версии этих демонов ожидали сообщения с завершением NUL - хотя в соответствующей спецификации (RFC 5424) этого нет. Более современные версии этих демонов не ожидают байта NUL, но вырезают его, если он есть, а еще более современные демоны (которые более точно придерживаются RFC 5424) передают байт NUL как часть сообщения.
Чтобы облегчить обработку сообщений syslog при всех этих различиях в поведении демонов, добавление байта NUL было сделано настраиваемым с помощью атрибута уровня класса
append_nul
. По умолчанию он имеет значениеTrue
(сохраняя существующее поведение), но может быть установлен наFalse
для экземпляраSysLogHandler
, чтобы этот экземпляр не добавлял терминатор NUL.Изменено в версии 3.3: (См.: bpo-12419.) В предыдущих версиях не было возможности использовать префикс «ident» или «tag» для идентификации источника сообщения. Теперь это можно указать с помощью атрибута на уровне класса, по умолчанию
""
для сохранения существующего поведения, но этот атрибут может быть переопределен для экземпляраSysLogHandler
, чтобы этот экземпляр добавлял идентификатор к каждому обрабатываемому сообщению. Обратите внимание, что предоставленный идентификатор должен быть текстом, а не байтом, и добавляется к сообщению точно в таком виде.
-
encodePriority
(facility, priority)¶ Кодирует объект и приоритет в целое число. Вы можете передавать строки или целые числа - если передаются строки, для преобразования их в целые числа используются внутренние словари отображения.
Символьные значения
LOG_
определены вSysLogHandler
и отражают значения, определенные в заголовочном файлеsys/syslog.h
.Приоритеты
Имя (строка)
Символическое значение
alert
LOG_ALERT
crit
илиcritical
LOG_CRIT
debug
LOG_DEBUG
emerg
илиpanic
LOG_EMERG
err
илиerror
LOG_ERR
info
LOG_INFO
notice
LOG_NOTICE
warn
илиwarning
LOG_WARNING
Удобства
Имя (строка)
Символическое значение
auth
LOG_AUTH
authpriv
LOG_AUTHPRIV
cron
LOG_CRON
daemon
LOG_DAEMON
ftp
LOG_FTP
kern
LOG_KERN
lpr
LOG_LPR
mail
LOG_MAIL
news
LOG_NEWS
syslog
LOG_SYSLOG
user
LOG_USER
uucp
LOG_UUCP
local0
LOG_LOCAL0
local1
LOG_LOCAL1
local2
LOG_LOCAL2
local3
LOG_LOCAL3
local4
LOG_LOCAL4
local5
LOG_LOCAL5
local6
LOG_LOCAL6
local7
LOG_LOCAL7
-
mapPriority
(levelname)¶ Сопоставляет имя уровня протоколирования с именем приоритета syslog. Вам может понадобиться переопределить этот параметр, если вы используете пользовательские уровни или если алгоритм по умолчанию не подходит для ваших нужд. Алгоритм по умолчанию сопоставляет
DEBUG
,INFO
,WARNING
,ERROR
иCRITICAL
с эквивалентными именами syslog, а все остальные имена уровней - с „warning“.
-
NTEventLogHandler¶
Класс NTEventLogHandler
, расположенный в модуле logging.handlers
, поддерживает отправку сообщений регистрации в локальный журнал событий Windows NT, Windows 2000 или Windows XP. Прежде чем вы сможете его использовать, вам необходимо установить Win32-расширения Марка Хаммонда для Python.
-
class
logging.handlers.
NTEventLogHandler
(appname, dllname=None, logtype='Application')¶ Возвращает новый экземпляр класса
NTEventLogHandler
. Имя appname используется для определения имени приложения, которое появляется в журнале событий. По этому имени создается соответствующая запись в реестре. Имя dllname должно содержать полное имя пути к .dll или .exe, содержащей определения сообщений для сохранения в журнале (если не указано, то используется'win32service.pyd'
- он устанавливается с расширениями Win32 и содержит некоторые базовые определения сообщений. Обратите внимание, что использование этих заполнителей сделает ваши журналы событий большими, так как весь источник сообщения будет храниться в журнале. Если вам нужны более компактные журналы, вы должны передать имя вашей собственной .dll или .exe, которая содержит определения сообщений, которые вы хотите использовать в журнале событий). Тип logtype - один из'Application'
,'System'
или'Security'
, по умолчанию используется'Application'
.-
close
()¶ На этом этапе вы можете удалить имя приложения из реестра в качестве источника записей журнала событий. Однако, если вы это сделаете, вы не сможете увидеть события, как вы планировали, в Event Log Viewer - он должен иметь доступ к реестру, чтобы получить имя .dll. Текущая версия этого не делает.
-
emit
(record)¶ Определяет идентификатор сообщения, категорию события и тип события, а затем регистрирует сообщение в журнале событий NT.
-
getEventCategory
(record)¶ Возвращает категорию события для данной записи. Переопределите это значение, если вы хотите указать свои собственные категории. Эта версия возвращает 0.
-
getEventType
(record)¶ Возвращает тип события для данной записи. Переопределите это, если вы хотите указать свои собственные типы. Эта версия выполняет отображение, используя атрибут typemap обработчика, который установлен в
__init__()
в словарь, содержащий отображения дляDEBUG
,INFO
,WARNING
,ERROR
иCRITICAL
. Если вы используете свои собственные уровни, вам нужно будет либо переопределить этот метод, либо поместить подходящий словарь в атрибут typemap обработчика.
-
getMessageID
(record)¶ Возвращает идентификатор сообщения для данной записи. Если вы используете свои собственные сообщения, вы можете сделать это, передав регистратору msg в виде ID, а не строки формата. Затем, здесь, вы можете использовать поиск по словарю, чтобы получить ID сообщения. Эта версия возвращает 1, что является базовым ID сообщения в
win32service.pyd
.
-
SMTPHandler¶
Класс SMTPHandler
, расположенный в модуле logging.handlers
, поддерживает отправку сообщений журнала на адрес электронной почты по протоколу SMTP.
-
class
logging.handlers.
SMTPHandler
(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)¶ Возвращает новый экземпляр класса
SMTPHandler
. Экземпляр инициализируется адресами from и to и темой письма. Адреса toaddrs должны быть списком строк. Чтобы указать нестандартный SMTP-порт, используйте кортеж (host, port) для аргумента mailhost. Если вы используете строку, будет использоваться стандартный SMTP-порт. Если ваш SMTP-сервер требует аутентификации, вы можете указать кортеж (имя пользователя, пароль) для аргумента credentials.Чтобы указать использование защищенного протокола (TLS), передайте кортеж в аргументе secure. Он будет использоваться только при предоставлении учетных данных аутентификации. Кортеж должен быть либо пустым, либо кортежем с одним значением и именем файла ключа, либо кортежем с двумя значениями и именами файла ключа и файла сертификата. (Этот кортеж передается в метод
smtplib.SMTP.starttls()
).Для связи с SMTP-сервером можно указать тайм-аут, используя аргумент timeout.
Добавлено в версии 3.3: Был добавлен аргумент timeout.
-
emit
(record)¶ Формирует запись и отправляет ее указанным адресатам.
-
getSubject
(record)¶ Если вы хотите указать строку темы, зависящую от записи, переопределите этот метод.
-
MemoryHandler¶
Класс MemoryHandler
, расположенный в модуле logging.handlers
, поддерживает буферизацию записей журнала в памяти, периодически сбрасывая их в обработчик target. Промывка происходит всякий раз, когда буфер заполнен, или когда происходит событие определенной серьезности или выше.
MemoryHandler
является подклассом более общего BufferingHandler
, который представляет собой абстрактный класс. Он буферизирует записи журнала в памяти. При добавлении каждой записи в буфер выполняется проверка вызовом shouldFlush()
, чтобы узнать, следует ли очистить буфер. Если это необходимо, то ожидается, что flush()
выполнит очистку.
-
class
logging.handlers.
BufferingHandler
(capacity)¶ Инициализирует обработчик с буфером указанной емкости. Здесь емкость означает количество буферизуемых записей журнала.
-
emit
(record)¶ Добавьте запись в буфер. Если
shouldFlush()
возвращает true, вызовитеflush()
для обработки буфера.
-
flush
()¶ Вы можете переопределить его, чтобы реализовать пользовательское поведение при очистке. В этой версии буфер просто опустошается.
-
shouldFlush
(record)¶ Возвращает
True
, если буфер заполнен до отказа. Этот метод может быть переопределен для реализации пользовательских стратегий промывки.
-
-
class
logging.handlers.
MemoryHandler
(capacity, flushLevel=ERROR, target=None, flushOnClose=True)¶ Возвращает новый экземпляр класса
MemoryHandler
. Экземпляр инициализируется с размером буфера capacity (количество буферизованных записей). Если flushLevel не указан, то используетсяERROR
. Если не указана цель, то ее необходимо установить с помощьюsetTarget()
, прежде чем этот обработчик сделает что-либо полезное. Если flushOnClose указан какFalse
, то буфер не очищается при закрытии обработчика. Если не указано или указано какTrue
, то при закрытии обработчика будет происходить предыдущее поведение по очистке буфера.Изменено в версии 3.6: Добавлен параметр flushOnClose.
-
flush
()¶ Для
MemoryHandler
промывка означает просто отправку буферизованных записей на цель, если таковая существует. Буфер также очищается, когда это происходит. Переопределите, если хотите другого поведения.
-
setTarget
(target)¶ Устанавливает целевой обработчик для этого обработчика.
-
shouldFlush
(record)¶ Проверяет заполненность буфера или наличие записи на уровне flushLevel или выше.
-
HTTPHandler¶
Класс HTTPHandler
, расположенный в модуле logging.handlers
, поддерживает отправку сообщений протоколирования на веб-сервер, используя семантику GET
или POST
.
-
class
logging.handlers.
HTTPHandler
(host, url, method='GET', secure=False, credentials=None, context=None)¶ Возвращает новый экземпляр класса
HTTPHandler
. Значение host может иметь видhost:port
, если вам необходимо использовать определенный номер порта. Если не указан method, используетсяGET
. Если secure равно true, будет использоваться HTTPS-соединение. Параметр context может быть установлен в экземплярssl.SSLContext
для настройки параметров SSL, используемых для HTTPS-соединения. Если указаны credentials, то это должен быть кортеж, состоящий из userid и password, который будет помещен в заголовок HTTP „Authorization“ с использованием Basic-аутентификации. Если вы указываете учетные данные, вы также должны указать secure=True, чтобы ваши userid и password не передавались в открытом виде по проводам.Изменено в версии 3.5: Был добавлен параметр context.
-
mapLogRecord
(record)¶ Предоставляет словарь, основанный на
record
, который должен быть URL-кодирован и отправлен на веб-сервер. Реализация по умолчанию просто возвращаетrecord.__dict__
. Этот метод может быть переопределен, если, например, только подмножествоLogRecord
должно быть отправлено на веб-сервер, или если требуется более конкретная настройка того, что отправляется на сервер.
-
emit
(record)¶ Отправляет запись на веб-сервер в виде URL-кодированного словаря. Метод
mapLogRecord()
используется для преобразования записи в отправляемый словарь.
Примечание
Поскольку подготовка записи к отправке на веб-сервер - это не то же самое, что общая операция форматирования, использование
setFormatter()
для указанияFormatter
дляHTTPHandler
не имеет никакого эффекта. Вместо вызоваformat()
этот обработчик вызываетmapLogRecord()
, а затемurllib.parse.urlencode()
для кодирования словаря в форму, подходящую для отправки на веб-сервер.-
QueueHandler¶
Добавлено в версии 3.2.
Класс QueueHandler
, расположенный в модуле logging.handlers
, поддерживает отправку сообщений протоколирования в очередь, например, реализованную в модулях queue
или multiprocessing
.
Наряду с классом QueueListener
, QueueHandler
можно использовать для того, чтобы позволить обработчикам выполнять свою работу в отдельном потоке от того, который выполняет логирование. Это важно для веб-приложений, а также других сервисных приложений, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, а любые потенциально медленные операции (например, отправка электронного письма через SMTPHandler
) выполняются в отдельном потоке.
-
class
logging.handlers.
QueueHandler
(queue)¶ Возвращает новый экземпляр класса
QueueHandler
. Экземпляр инициализируется очередью для отправки сообщений. Очередь queue может быть любым объектом типа очереди; она используется как есть методомenqueue()
, который должен знать, как посылать в нее сообщения. Очередь не обязана иметь API отслеживания задач, что означает, что вы можете использовать экземплярыSimpleQueue
для queue.Примечание
Если вы используете
multiprocessing
, вам следует избегать использованияSimpleQueue
и вместо этого использоватьmultiprocessing.Queue
.-
emit
(record)¶ Записывает результат подготовки записи LogRecord. Если возникает исключение (например, из-за заполнения ограниченной очереди), вызывается метод
handleError()
для обработки ошибки. В результате запись может быть тихо отброшена (еслиlogging.raiseExceptions
равноFalse
) или напечатано сообщение вsys.stderr
(еслиlogging.raiseExceptions
равноTrue
).
-
prepare
(record)¶ Подготавливает запись для постановки в очередь. Объект, возвращаемый этим методом, ставится в очередь.
Базовая реализация форматирует запись, чтобы объединить сообщение, аргументы, исключение и информацию о стеке, если она присутствует. Кроме того, она удаляет из записи неподбираемые элементы на месте. В частности, она перезаписывает атрибуты
msg
иmessage
объединенным сообщением (полученным вызовом метода обработчикаformat()
) и устанавливает атрибутыargs
,exc_info
иexc_text
в значениеNone
.Вы можете переопределить этот метод, если хотите преобразовать запись в строку dict или JSON, или отправить измененную копию записи, оставив оригинал нетронутым.
-
enqueue
(record)¶ Записывает запись в очередь, используя
put_nowait()
; вы можете переопределить это, если хотите использовать блокирующее поведение, или таймаут, или индивидуальную реализацию очереди.
-
listener
¶ При создании через конфигурацию с помощью
dictConfig()
этот атрибут будет содержать экземплярQueueListener
для использования с этим обработчиком. В противном случае он будетNone
.Добавлено в версии 3.12.
-
QueueListener¶
Добавлено в версии 3.2.
Класс QueueListener
, расположенный в модуле logging.handlers
, поддерживает прием сообщений протоколирования из очереди, например, реализованных в модулях queue
или multiprocessing
. Сообщения принимаются из очереди во внутреннем потоке и передаются в том же потоке одному или нескольким обработчикам для обработки. Хотя QueueListener
сам по себе не является обработчиком, он задокументирован здесь, поскольку работает рука об руку с QueueHandler
.
Наряду с классом QueueHandler
, QueueListener
можно использовать для того, чтобы позволить обработчикам выполнять свою работу в отдельном потоке от того, который выполняет логирование. Это важно для веб-приложений, а также других сервисных приложений, где потоки, обслуживающие клиентов, должны отвечать как можно быстрее, а любые потенциально медленные операции (например, отправка электронного письма через SMTPHandler
) выполняются в отдельном потоке.
-
class
logging.handlers.
QueueListener
(queue, *handlers, respect_handler_level=False)¶ Возвращает новый экземпляр класса
QueueListener
. Экземпляр инициализируется очередью для отправки сообщений и списком обработчиков, которые будут обрабатывать записи, помещенные в очередь. Очередью может быть любой объект типа очереди; она передается как есть методуdequeue()
, который должен знать, как получать сообщения из нее. Очередь не обязательно должна иметь API отслеживания задач (хотя она используется, если доступна), что означает, что вы можете использовать экземплярыSimpleQueue
для queue.Примечание
Если вы используете
multiprocessing
, вам следует избегать использованияSimpleQueue
и вместо этого использоватьmultiprocessing.Queue
.Если
respect_handler_level
равноTrue
, уровень обработчика учитывается (по сравнению с уровнем для сообщения) при принятии решения о передаче сообщений этому обработчику; в противном случае поведение будет таким же, как и в предыдущих версиях Python - всегда передавать каждое сообщение каждому обработчику.Изменено в версии 3.5: Был добавлен аргумент
respect_handler_level
.-
dequeue
(block)¶ Удаляет запись и возвращает ее, по желанию блокируя.
В базовой реализации используется
get()
. Вы можете переопределить этот метод, если хотите использовать таймауты или работать с пользовательскими реализациями очередей.
-
prepare
(record)¶ Подготовьте запись для обработки.
Эта реализация просто возвращает переданную запись. Вы можете переопределить этот метод, если вам нужно сделать какой-либо пользовательский маршалинг или манипуляции с записью перед передачей ее обработчикам.
-
handle
(record)¶ Обработайте запись.
Это просто перебирает обработчики, предлагая им запись для обработки. Фактически обработчикам передается объект, который возвращается из
prepare()
.
-
start
()¶ Запускает слушателя.
Это запускает фоновый поток для мониторинга очереди на обработку записей LogRecords.
-
stop
()¶ Останавливает слушателя.
Эта команда просит поток завершить работу, а затем ждет, пока он это сделает. Обратите внимание, что если вы не вызовете эту команду до завершения работы приложения, в очереди могут остаться записи, которые не будут обработаны.
-
enqueue_sentinel
()¶ Записывает сигнал в очередь, чтобы сообщить слушателю о выходе. В данной реализации используется
put_nowait()
. Вы можете переопределить этот метод, если хотите использовать таймауты или работать с пользовательскими реализациями очередей.Добавлено в версии 3.3.
-
См.также
- Модуль
logging
Ссылка на API для модуля протоколирования.
- Модуль
logging.config
API конфигурации для модуля протоколирования.