Connect with us

Обучение

Заметки Python #20: Логирование

52

 

Еще один важный этап при написании приложения — возможность получать логи критично важного функционала приложения

Логи мои логи

Логи — важная часть приложения на любом языке программирования. Они помогут определить ошибку не на этапе написания кода, а на этапе работы с готовым продуктом. С их помощью легче находить баги и оказывать техническую поддержку конечным пользователям. В питоне это можно реализовать с помощью встроенного модуля logging.

Модуль logging

Данный модуль создан, чтобы мониторить и записывать события, ошибки, предупреждения и отладочную информацию в приложениях. Их можно хранить как локально, так и отсылать на удаленный хост. Модуль имеет встроенную фильтрацию, чтобы мы могли настроить логи под себя — какую информацию, куда и как часто передавать

[adace-ad id=»3482″]

 

Уровни логов

Уровни созданы для того, чтобы устанавливать важность и тем самым, определять будет ли сделана запись в лог или нет. Имеют как числовое, так и текстовое обозначение. Уровень — пороговое значение, ниже которого, запись не будет сделана в лог. Каждый уровень к каждой функции мы выставляем самостоятельно — решаем, насколько это важно в каждом конкретном случае.

УровеньЗначениеОписание
CRITICAL50Критические ошибки/сообщения
ERROR40Ошибки
WARNING30Предупреждения
INFO20Информационные сообщения
DEBUG10Отладочная информация
NOTSET0Уровень не установлен

Для этого используется метод log.setLevel(level) используется для выполнения простой фильтрации на основе числового значения уровня важности сообщений. Он устанавливает этот уровень в объекте log в соответствии со значением аргумента level. Обрабатываться будут только сообщения с уровнем важности, равным значению level или выше его. Например: log.setLevel(logging.INFO) [adace-ad id=»3473″]

 

Основная настройка модуля logging

Для использования модуля необходимо предварительно его настроить. Конкретно нас интересует корневой регистратор (Logger). Он содержит настройки по умолчанию: уровень важности логов, поток вывода, формат сообщений и другие параметры. Настраивают Logger через функцию basicConfig([**kwargs]). Эта функция должна вызываться первой из модуля logging. Она принимает множество именованных аргументов

Именованный аргументОписание
filenameЖурналируемые сообщения будут добавляться в файл с указанным именем.
filemodeОпределяет режим открытия файла. По умолчанию используется режим a (добавление в конец).
formatСтрока формата для формирования сообщений.
datefmtСтрока формата для вывода даты и времени.
levelУстанавливает уровень важности корневого регистратора. Обрабатываться будут сообщения с уровнем важности, равным указанному или выше его. Сообщения с более низким уровнем будут игнорироваться.
streamОпределяет объект открытого файла, куда будут записываться журналируемые сообщения. По умолчанию используется поток std.stderr. Этот аргумент не может использоваться одновременно с filename.

Назначение большинства этих аргументов понятно по их названиям. format определяет формат журналируемых сообщений с дополнительной контекстной информацией — именами файлов, уровнями важности, номерами строк. Аргумент datefmt определяет формат вывода дат, совместимый с функцией time.strftime(). Если он не определен, даты форматируются в соответствии со стандартом ISO8601.

Аргумент format

Данный аргумент будет формировать лог по выбранным вами параметрам:

ФорматОписание
%(name)sИмя регистратора
%(levelno)sЧисловой уровень важности
%(levelname)sСимволическое имя уровня важности
%(pathname)sПуть к исходному файлу, откуда была выполнена запись в журнал
%(filename)sИмя исходного файла, откуда была выполнена запись в журнал
%(funcName)sИмя функции, выполнившей запись в журнал
%(module)sИмя модуля, откуда была выполнена запись в журнал
%(lineno)dНомер строки, откуда была выполнена запись в журнал
%(created)fВремя, когда была выполнена запись в журнал. Значением должно быть число — такое, как возвращаемое функцией time.time()
%(asctime)sВремя, когда была выполнена запись в журнал, в формате ASCII
%(msecs)sМиллисекунда, когда была выполнена запись в журнал
%(thread)dЧисловой идентификатор потока выполнения
%(threadName)sИмя потока выполнения
%(process)dЧисловой идентификатор процесса
%(message)sТекст журналируемого сообщения (определяется пользователем)

Выглядит это вот так:

import logging
logging.basicConfig(
filename = «app.log»,
format = «%(levelname)-10s %(asctime)s %(message)s»,
level = logging.INFO
)

Как создать объект класса Logger?

Чтобы создать экземпляр класса Logger необходимо вызвать функцию getLogger(). Она возвращает экземпляр класса Logger с именем logname. Если объект с таким именем не существует, создается и возвращается новый экземпляр класса Logger. Вот так: getLogger(‘str’). В качестве аргумента функции нужно передать строку — она же будет являться именем объекта. Например, getLogger(‘logusers’).

Стоит запомнить, что передавать имя в функцию getLogger всегда обязательно. Полный код создания объекта будет выглядеть таким образом: log = logging.getLogger(‘name’). Через точку в имя можно добавить дополнительный идентификатор (например, с чего будем собирать логи). Например, name.serverconnect и так далее.

[adace-ad id=»3475″]

 

Как записать лог?

Итак, мы создали объект log, который является экземпляром класса Logger. Можно использовать следующие методы, чтобы сделать запись в журнал. Именованный аргумент exc_info (True/False) определяет, добавлять ли в сообщение информацию об исключении, полученную при вызове sys.exc_info(). Именованный аргумент extra определяет словарь с дополнительными значениями для использования в строке формата.

Уровень важностиМетод
CRITICALlog.critical(fmt [, *args [, exc_info [, extra]]])
ERRORlog.error(fmt [, *args [, exc_info [, extra]]])
WARNINGlog.warning(fmt [, *args [, exc_info [, extra]]])
INFOlog.info(fmt [, *args [, exc_info [, extra]]])
DEBUGlog.debug(fmt [, *args [, exc_info [, extra]]])

Как это выглядит?

log.info(‘Информация к сведению’)
log.warning(‘Предупреждение’)
log.critical(‘Критическая ошибка приложения’)

Обработка сообщений

Обычно сообщения обрабатываются корневым регистратором. Однако любой объект класса Logger может иметь свои специальные обработчики, принимающие и обрабатывающие сообщения. Реализовать это можно с помощью следующих методов экземпляра log класса Logger:

  • log.addHandler(handler) — добавляет объект класса Handler в регистратор;
  • log.removeHandler(handler) — удаляет объект класса Handler из регистратора.

Пример кода:

 

Результат:

Формат логов с помощью Formatter

Чтобы определить формат сообщения логов, нужно создать объект класса Formatter. Чтобы задействовать объект класса Formatter, его необходимо подключить к обработчику. Метод log.setFormatter(format) подключает объект форматирования, который будет использоваться экземпляром h класса Handler при создании сообщений. В аргументе format должен передаваться объект класса Formatter.

 

Результат:

Нажмите что бы оставить комментарий

Ответить

Ваш e-mail не будет опубликован.

Лучшие сервисы стриминга музыки в 2019 году

Сервисы

autoteka-digital2-vin autoteka-digital2-vin

Проверка авто по Автотеке: может ли она обмануть?

Сервисы

Wink Ростелеком: Samsung LG, Sony, Phillips, Android TV

Ростелеком

LG WEB OS: приложения, обновления, настройка, проблемы со звуком

Гаджеты

.

Digital2.ru - Тренды, IT, WEB- разработка, Цифровая экономика
Свободное копирование и распространение материалов с сайта Digital2.ru
разрешено только с указанием активной ссылки на Digital2 как на источник.
Данный сайт в ходит структуру медиа группы: Online Payments Group Intellect Organic
Товарный знак: OPGIO
Copyright 2019 © All rights reserved

Connect
Подпишись на нас