Ведение журнала Python: как найти ошибки скрипта с помощью модуля ведения журнала Python?

Ведение журнала Python Программирование и разработка

Python — популярный объектно-ориентированный язык программирования. Многие разработчики ценят Python, потому что язык сценариев быстрее создает программы, чем скомпилированные языки, такие как Java. По сравнению с «традиционными» процедурными языками программирования, такими как Perl, Python имеет то преимущество, что его легко читать и легко поддерживать. Будь то искусственный интеллект, графический пользовательский интерфейс или системное администрирование: Python можно использовать для самых разных задач. Но чем чаще используется язык программирования, тем важнее иметь хорошую культуру ошибок. Регистрация должна происходить с первой фазы разработки до фактического использования пользователем.

Удобный модуль логирования существует в библиотеке Python. Этот модуль ведения журнала Python может значительно упростить работу разработчиков и операторов как для простой отладки, так и для централизованного ведения журнала с разных серверов.

Что такое ведение журнала?

Ведение журнала происходит от английского термина «журнал» и в данном контексте означает протокол. Подобно бортовому журналу, он содержит все важные записи о ходе событий. В зависимости от того, что подлежит проверке, записываются либо только определенные действия или события в процессе, либо проверяется каждое отдельное действие.

Когда вы изучаете новый язык программирования, вы неизбежно делаете некоторые ошибки. Даже если Python понятен для тех, кто уже знает такие языки программирования, как C++ или Java из-за схожей структуры (например, формы циклов), у каждого языка есть свои особенности. Python, например, использует отступы для представления иерархий, и если вы пропустите недостающий пробел в запале, даже самое простое приложение не будет работать. Журнал ошибок предупреждает неопытных разработчиков о соответствующей строке и ошибке «неожиданный отступ» во время отладки. В этом случае ведение журнала Python регистрирует простые ошибки скрипта и выводит сообщение. Но журналирование может сделать еще больше. Разработчики используют программы входа в систему для самых разных областей применения:

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

Ведение журнала может генерировать много данных, особенно при написании сложного приложения с помощью Python. Разработчики собирают эти данные с помощью Python logging-to-file (то есть файл журнала, который создается модулем ведения журнала Python и заполняется информацией журнала через обработчик). Важно, чтобы лог-файл работал асинхронно. В противном случае вход в Python может заблокировать выполнение скрипта.

Анализ ошибок с ведением журнала Python: 5 уровней приоритезации журнала

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

Читайте также:  Способы проверки доступности пакета в Yum с подробными инструкциями

Простое ведение журнала избавляет вас от дополнительной работы и позволяет использовать более элегантное решение для анализа ошибок. Ведение журнала Python знает пять различных уровней серьезности ошибок — в оригинале: Level of Severity. Если вы хотите создать свой собственный фильтр журнала, вы, конечно, можете это сделать. Включенный модуль ведения журнала Python от Vinay Sajip уже предлагает уровень серьезности, который имеет для нас смысл:

Имя уровня ведения журнала Использовать Возможный выпуск новостей
отлаживать Диагностика проблемы, очень подробная Неожиданный отступ в строке XY
Информация Обеспечивает обратную связь о том, что система работает правильно Функция 1*1 выполняется
Предупреждение Приложение в основном работает правильно, но возникла непредвиденная ситуация или появилось предупреждение о будущей проблеме Место для хранения заканчивается
ошибки Не удалось выполнить функцию, поскольку возникла проблема. Произошла ошибка, и действие было прервано
критический Возникла серьезная проблема. Возможно, потребуется остановить все приложение Неустранимая ошибка: программа не может получить доступ к этой службе и должна быть закрыта.

Различные уровни представляют информацию о событиях возрастающей важности.Уровни ведения журнала Python являются статическими функциями. В объектно-ориентированном программировании эти функции являются частью класса. Статические функции всегда одинаковы для каждого экземпляра класса внутри объекта. Они не изменяются и присутствуют, даже если ни один экземпляр не вызывается. Например, Error — это сообщение об ошибке в каждом экземпляре. Если он вызывается в том же объекте выполнения, соответствующее сообщение об ошибке остается тем же. Для других действий можно задать другое сообщение об ошибке.

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

Модуль ведения журнала Python

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

  • loggers
  • handlers
  • filter
  • formatter

Экземпляры объединяются в экземпляре LogRecord и обмениваются информацией внутри экземпляра.

loggers

Регистраторы записывают действия во время выполнения программы. Они не отображаются непосредственно как экземпляры, а вызываются с помощью функции logging.getLogger(Loggername). Присвойте регистратору имя, например, для структурированного отображения иерархий. В Python вы представляете дочерние пакеты, разделенные точкой, поэтому журнал пакетов может иметь дочерние пакеты log.bam или log.bar.loco. Регистраторы работают аналогичным образом, поэтому объект «log» получает информацию своих дочерних элементов «log.bam» и «log.bar.loco».

Читайте также:  12 лучших примеров Java-приложений, используемых во всем мире в 2023 году

handlers

Обработчики берут информацию от регистраторов и отправляют ее дальше. Handler — это базовый класс, который определяет, как действует интерфейс экземпляров Handler. Вы устанавливаете цель с соответствующим классом обработчика. StreamHandler отправляет информацию в потоки, FileHandler отправляет ее в файлы. Вы можете использовать несколько обработчиков для программы, которая отправляет сообщения из одного регистратора. Это имеет смысл, если, например, вы хотите отображать отладочную информацию в консоли, а важные сообщения об ошибках — в отдельном файле.

Используйте метод setLevel(), чтобы установить самый низкий уровень серьезности, при котором сообщение журнала должно быть отправлено этому обработчику. Вместо logger.setLevel (который определяет уровень ведения журнала) метод вызывается [имя_обработчика].setLevel (см. строку шаблона кода 5: fh.setLevel).

formatter

В отличие от обработчиков форматтеры (объекты форматирования) могут использоваться непосредственно как экземпляры в коде приложения. С помощью этих экземпляров вы определяете формат, в котором ваше уведомление выводится в файл журнала. Если вы не используете какое-либо форматирование, появится только указанное сообщение от логгера. Вызовите средство форматирования и установите формат сообщения и даты с помощью следующей функции:

logging.Formatter.__init__(fmt=[Nachrichtenformat], datefmt=[Datumsformat])
#oder auch:
logging.Formatter.__init__(fmt=None, datefmt=None)

Если вы не укажете формат даты в атрибуте, средство форматирования использует американскую форму и спецификацию времени : «год-месяц-день часы:минуты:секунды».

filter

Фильтры позволяют еще более точно определить выводимые сообщения. Сначала вы определяете фильтры, а затем добавляете их в соответствующий обработчик или регистратор с помощью метода addFilter(). Если значение фильтра равно false на основе свойств сообщения, оно не пропускает сообщение. Используйте функцию logging.Filter(name=fh), где атрибут fh представляет имя любого регистратора, чтобы разрешить данные журнала определенного регистратора и заблокировать все другие регистраторы.

Модуль ведения журнала Python в примере

Python предоставляет разработчикам инструмент для рисования Turtle, позволяющий опробовать основные команды на примере. В следующем примере пользователь использует Turtle. Инструмент рисования должен бежать прямо по зеленому фону, поворачивать налево, бежать дальше и затем описывать круг. Мы включаем команды ведения журнала Python Info и Error в пример :

# -*- coding: UTF-8 -*-
import turtle
import logging
turtle.bgcolor("green")
turtle.fd(30)
turtle.lt(90)
turtle.fd(50)
logging.info('Läuft bei Dir.')
turtle.circle(50)
logging.error('Upps, da ist etwas schiefgelaufen.')

Консоль отображает уровень ведения журнала ERROR

Консоль отображает уровень ведения журнала ERROR, но не выдает сообщение уровня INFO.

На изображении выше вы можете увидеть, как выглядит результат. Модуль черепахи (левое окно) принял команды и работает, как указано. В окне справа код включает в себя не только команды черепашки, но и команды логирования уровней INFO и ERROR. Типичная форма вывода сообщения журнала выглядит следующим образом: [серьезность]:[происхождение сообщения]:[содержание сообщения]

Однако консоль (Console 1/A) в этом примере показывает только сообщение журнала Python ERROR: Error :root:Oops, что-то пошло не так.

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

Читайте также:  Пример создания пула соединений в PostgreSQL с использованием библиотеки Psycopg2 — полное руководство и полезные рекомендации

Изменить уровень ведения журнала Python

Используйте следующую команду, чтобы изменить настройку на уровень DEBUG:

logging.basicConfig(level=logging.DEBUG)

На картинке выше консоль показывает журнал для каждого нового вызова. Если вы остановите программу, консоль удалит все записи. Вы должны использовать файл журнала для отслеживания ваших данных регистрации. Эта практика называется Logging to File, т.е. сохранение записей журнала в файле.

Сохранить ведение журнала Python в файл

Ведение журнала Python в файл работает двумя способами. Либо вы создаете файл журнала об основных настройках, либо используете обработчик. Если вы не укажете цель, ведение журнала Python временно сохранит информацию в консоли.

Чтобы создать файл для ведения журнала Python:

import logging
logging.basicConfig( level=logging.DEBUG, filename='example.log')

FileHandler является экземпляром класса ведения журнала. Он действует вместе с экземпляром журнала. Он отвечает за то, куда и в какой форме пересылаются данные регистрации. В дополнение к FileHandler в модуле ведения журнала библиотеки Python есть и другие обработчики журналов, такие как StreamHandler и NullHandler. Однако рекомендуется использовать файл журнала для последующей оценки данных регистрации.

Чтобы создать FileHandler, который помещает отладочные сообщения в файл:

Чтобы создать FileHandler, который помещает отладочные сооб

FileHandler «fh» с атрибутом debug.log создает файл, указанный в качестве атрибута, и отправляет сообщения из регистратора в виде простого текстового вывода.

На изображении выше команда logging.getLogger() вызывает модуль ведения журнала Python. «fh» определяется как FileHandler с атрибутом «debug.log». При этом fh создает файл журнала «debug.log» и отправляет сообщения журнала, которые возникают у вас. Метод addHandler () назначает регистратору соответствующий обработчик. Вы можете назвать файл журнала по своему усмотрению.

Вы можете использовать следующие функции, чтобы попробовать это самостоятельно:

import logging
logger = logging.getLogger('Beispiel_Log')
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('debug.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
logger.debug('Debug-Nachricht')
logger.info('Info-Nachricht')
logger.warning('Warnhinweis')
logger.error('Fehlermeldung')
logger.critical('Schwerer Fehler')

Если вы хотите, чтобы файл журнала, который вы создаете с помощью Python-Logging-to-File, предоставлял полезную информацию для конкретных задач, простых сообщений иногда недостаточно. Отметка времени и имя регистратора помогают лучше классифицировать информацию. На следующем изображении показан пример установки формата с помощью атрибутов средства форматирования. В окне блокнота debug.log текстовый вывод указывает сообщения журнала с датой, временем, именем регистратора, уровнем журнала и сообщением.

Если вы хотите, чтобы файл журнала, который вы создаете

Средство форматирования в модуле ведения журнала Python предоставляет полезную, удобочитаемую информацию, которая помогает в исправлении ошибок или анализе.

Вот код еще раз, так что вы можете попробовать его самостоятельно:

import logging
logger = logging.getLogger('Beispiel_Log')
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler('debug.log')
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
logger.debug('Debug-Nachricht')
logger.info('Info-Nachricht')
logger.warning('Warnhinweis')
logger.error('Fehlermeldung')
logger.critical('Schwerer Fehler')

Заключение

Ведение журнала Python — удобный инструмент для предотвращения ошибок, проверки после хакерских атак или просто для анализа. В то время как другие языки программирования добавляют журналирование из вторых рук, модуль ведения журнала Python является частью стандартной библиотеки. Включение метода в ваш код создает лог-сообщения разного уровня: как в файлах, так и на консоли. Форматирование и фильтры, а также обработчики обеспечивают удобную настройку. Убедитесь, что вы используете имена для ваших регистраторов и их дочерних элементов, которые легко назначать, чтобы упростить работу с файлами журналов в Python.

Оцените статью
Блог о программировании
Добавить комментарий