Логирование в Python

Логирование — это процесс записи потока кода при его выполнении наряду с записью любых других событий. Запись происходит в файлы, которые впоследствии можно использовать для анализа и устранения возникающих неполадок.

Логирование помогает:

  • В отладке кода для определения потока исходного кода во время разработки и после развертывания.
  • Оповещении об исключительном событии, вызванном кодом. Например, нехватке памяти и т. д.
  • Поиске пользователей или систем, обращающихся к коду.
Содержание

Что должно записываться в логи?

Логи должны содержать сообщение, в котором указывается:

  • Информация о доступе: пользователи и устройства, имеющие доступ к коду.
  • Версия кода: текущая редакция приложения.
  • Отметка времени: отметки времени всех ключевых событий.
  • Результаты: результаты переменных, вычисленных в коде.
  • Исключения, возникающие вместе с трассировкой стека.
  • Поток кода: различные классы и функции, вызываемые во время выполнения кода.

Как реализовать логирование в Python?

Python предоставляет библиотеку «logging» для записи сообщений в файл или любой другой поток вывода.

Различные уровни логирования в порядке их сложности:

  1. DEBUG: используется только при диагностике проблем.
  2. INFO: только для информации, используемой для понимания потока кода при диагностике проблемы.
  3. WARNING: когда возникает непредвиденная ситуация, но код все еще выполняется.
  4. ERROR: когда код не может выполнять какую-либо функцию.
  5. CRITICAL: серьезная ошибка, когда программа не может продолжить работ.

Простой код реализации логирования различных вариантов сложности:

import logging
logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

Вывод в консоль

Мы логируем структуру сообщений уровня WARNING, за которым следует корневой модуль логирования по умолчанию и сообщение. При этом отладочные и информационные сообщения не отображаются. Модуль регистрации по умолчанию отображает только сообщения с уровнем сложности WARNING и выше.

Как вывести сообщения для уровней сложности Debug и Info?

Мы используем метод basicConfig(), чтобы установить базовую конфигурацию для системы логирования.

import logginglogging.basicConfig(level=logging.debug)logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

Вывод в консоль

Метод basicConfig() не будет учитывать новые настройки, если корневой регистратор уже настроен. Мне пришлось перезапустить ядро, чтобы приведенный выше код работал правильно. Так как при первом вызове любой из функций она настраивает корневой регистратор внутри системы.

Параметры, принимаемые basicConfig()

filename: имя файла, в который нужно записать сообщение.

filemode: режим, в котором файл должен быть открыт. Например, «w» для записи, «a» — для добавления. Режим файла по умолчанию — «а».

format: строка формата, доступную в качестве атрибутов в LogRecord.

datefmt: формат даты, отображаемой в сообщениях лога. Формат должен быть передан time.strftime().

level: уровень сложности для корневого регистратора.

Запись сообщения лога в файл log.txt в режиме добавления с уровнем сложности DEBUG

import logging
logging.basicConfig(filename='log.txt', filemode='a', level=logging.DEBUG)logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

Файл log.txt с сообщениями лога

Запись отформатированного лога в файл log.txt в режиме добавления с уровнем сложности DEBUG

import logging
logging.basicConfig(filename='log.txt', filemode='a', 
                    format='%(asctime)s %(msecs)d- %(process)d 
                    -%(levelname)s - %(message)s', 
                    datefmt='%d-%b-%y %H:%M:%S %p' ,
                    level=logging.DEBUG)logging.debug('This is a debug message')
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')

Файл лога log.txt с отформатированными сообщениями лога

Регистрация сообщений в классах и функциях

Приведенный ниже фрагмент кода демонстрирует логирование в классах и функциях.

Мы создаем класс TestLog с divide(). Он принимает два параметра и возвращает результат деления. В случае ошибки в делении мы хотим иметь трассировку стека в файле лога.

import logging
class TestLog:
def __init__(self):
logging.info('init method')
def divide(self, x, y):
try:
logging.info(" Dividing...")
return x/y
except Exception as e:
logging.error(" Error in divide", exc_info=True)

Создание экземпляра класса TestLog и вызов divide().

import logginglogging.basicConfig(filename='app.txt', filemode='a',level=logging.DEBUG, format='%(asctime)s %(msecs)d- %(process)d-%(levelname)s - %(message)s')logging.info('Started')
x=10
y=2
t= TestLog()
num_1= t.divide(x,y)logging.info(" Result of dividing %d by %d is %d", x, y,num_1)

Сообщение лога в app.txt

Логирование трассировки стека

Для отображения трассировки стека нужно установить для exc_info значение true в блокеexcept обработки исключений.

logging.info('Started')
x=10
y=0
t= TestLog()
num_1= t.divide(x,y)
logging.info(" Result of dividing %d by %d is %d", x, y,num_1)

Трассировки стека

Заключение

Логирование помогает в устранении неполадок приложения во время разработки или после развертывания. Логирование может быть реализовано через запись в файлы, стандартного вывода или записи трассировки стека.

Данная публикация представляет собой перевод статьи «Logging in Python» , подготовленной дружной командой проекта Интернет-технологии.ру

Меню