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()

Закрывает файл.

emit(record)

Выводит запись в файл.

Обратите внимание, что если файл был закрыт из-за выключения журнала при выходе и режим файла равен „w“, запись не будет выдана (см. bpo-42378).

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.

close()

Вызывает flush(), устанавливает цель на None и очищает буфер.

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 конфигурации для модуля протоколирования.

Вернуться на верх