что такое logging в aiogram
Шпаргалка по логированию на Python
Авторизуйтесь
Шпаргалка по логированию на Python
Если Вы хотя бы немного знакомы с программированием и пробовали запускать что-то «в продакшен», то вам наверняка станет больно от такого диалога:
— Вась, у нас там приложение слегло. Посмотри, что случилось?
— Эмм… А как я это сделаю.
Да, у Василия, судя по всему, не настроено логирование. И это ужасно, хотя бы по нескольким причинам:
Впрочем, последний пункт, наверно, лишний. Однако, одну вещь мы поняли наверняка:
Логирование — крайне важная штука в программировании.
Что такое logging?
Модуль logging в Python — это набор функций и классов, которые позволяют регистрировать события, происходящие во время работы кода. Этот модуль входит в стандартную библиотеку, поэтому для его использования достаточно написать лишь одну строку:
У функции basicConfig() 3 основных параметра:
Давайте рассмотрим каждый из параметров более подробно.
Уровни логирования на Python
Наверно, всем очевидно, что события, которые генерирует наш код кардинально могут отличаться между собой по степени важности. Одно дело отлавливать критические ошибки ( FatalError ), а другое — информационные сообщения (например, момент логина пользователя на сайте).
Соответственно, чтобы не засорять логи лишней информацией, в basicConfig() Вы можете указать минимальный уровень фиксируемых событий.
По умолчанию фиксируются только предупреждения ( WARNINGS ) и события с более высоким приоритетом: ошибки ( ERRORS ) и критические ошибки ( CRITICALS ).
Если Вы хотите посмотреть все сообщения, необходимо передать соответствующий уровень ошибок:
А далее, чтобы записать информационное сообщение (или вывести его в консоль, об этом поговорим чуть позже), достаточно написать такой код:
И так далее. Теперь давайте обсудим, куда наши сообщения попадают.
Отображение лога и запись в файл
Другими словами, если Вы просто выполните такой код:
То сообщение WOW придёт Вам в консоль. Понятно, что в консоли никому эти сообщения не нужны. Как же тогда направить запись лога в файл? Очень просто:
Ок, с записью в файл и выбором уровня логирования все более-менее понятно. А как настроить свой шаблон? Разберёмся.
Кстати, мы собрали для Вас сублимированную шпаргалку по логированию на Python в виде карточек. У нас ещё много полезностей, не пожалеете 🙂
Форматирование лога
Итак, последнее, с чем нам нужно разобраться — форматирование лога. Эта опция позволяет Вам дополнять лог полезной информацией — датой, названием файла с ошибкой, номером строки, названием метода и так далее.
Например, если внутри basicConfig указать:
То вывод ошибки будет выглядеть так:
Вы можете сами выбирать, какую информацию включить в лог, а какую оставить. По умолчанию формат такой:
Важно помнить, что все параметры logging.basicConfig должны передаваться до первого вызова функций логирования.
Эпилог
Вместо заключения просто оставим здесь рабочий кусочек кода, который можно использовать 🙂
Если хотите разобраться с параметрами более подробно, Вам поможет официальная документация (очень неплохая, кстати).
Урок 3. Машина состояний и то самое логгирование
Урок проводится с использованием aiogram версии 1.2
Сегодня мы научимся использовать:
Традиционно код урока доступен на GitHub
Создаем состояния
Так как мы сейчас будем разбирать машину состояний, эти самые состояния необходимо сначала создать. Сперва в голову приходит использование енумов, однако я предпочел воспользоваться встроенным классом Helper, который подходит для данной задачи даже лучше.
Итак, запишем в файл utils.py наш демонстрационный класс с состояниями:
Ещё не забываем добавить в config.py токен своего бота и мы готовы писать логику!
Указываем хранилище состояний и включаем логгирование
К привычным с прошлых уроков импортам у нас добавляется ещё парочка, а именно:
И тут же применяем их:
На первой строчке мы указали хранилище состояний в оперативной памяти, так как потеря этих состояний нам не страшна (да и этот вариант больше всего подходит для демонстрационных целей, так как не требует настройки). Однако если у вас от состояний что-то зависит, рекомендуется ипользовать более надеждное хранилище. На данный момент можно подключить Redis и RethinkDB.
Обрабатываем входящие сообщения
Итак, по традиции добавляем обработчики команд start и help :
А так же «ловим» все сообщения, отправленные при «нулевом» состоянии:
Переходим к главной теме нашего урока: состояниям
Эти самые состояния нужно как-то устанавливать, поэтому сделаем так:
Не забываем, что хэндлеры обрабатываются в порядке их расположения в коде, поэтому описанная выше функция должна идти раньше приведенных ниже обработчиков.
Теперь отрабатываем входящие сообщения при выбранном состоянии
Теперь добавим такой хэндлер:
Библиотека сама понимает, когда мы передаем список состояний, а когда только одно состояние и под капотом обрабатывает их по-разному, но нам нет смысла об этом задумываться. В этом плане мы в плюсе, так как можем сделать вот так:
Ну и последний на сегодня хэндлер:
Он принимает в себя сообщения при всех состояниях из возможных в этом уроке, однако так как состояния с первого по четвертый ловятся хэндлерами выше, в этот попадают только нулевое и пятое.
Для красоты ещё стоит закрывать соединение с хранилищем состояний, для этого объявляем функцию:
Урок 2. Медиа, разметка, эмоджи и щепотка логирования
В этом уроке мы научим нашего бота:
А также воспользуемся логированием, дабы посмотреть, что происходит под капотом.
Зачем хранить айди файлов, которые мы отправляем?
Ещё вам необходимо знать, что каждый бот видит разные айди у всех медиа файлов. По айди, который получил один бот, другой бот не сможет отправить ничего, а при попытке сделать это получит ошибку.
Наконец-то код!
Для начала создаем модель таблицы для нашей базы данных. Файл db_map.py:
Теперь загружаем в Телеграм файлы и сохраняем возвращаемые айди в базу данных. Для этого я написал небольшой скрипт, который доступен по ссылке. Если будете исполнять его на своём компьютере, можете обратить внимание на то самое логирование библиотеки aiogram.
Вот результат выполнения скрипта:
Создаем хэндлер команд /start и /help :
Затем добавляем обработчики всех остальных команд
О каждой по отдельности (за одно разберем эмоджи):
Отправка аудио + ответ на определенное сообщение:
Отправка фото с комментарием + эмоджи:
Отправка медиагруппы (где смешались кони, люди фото и видео):
Внимание! На момент публикации заметки при использовании релизной версии библиотеки невозможно отправить медиагруппу представленным выше способом из-за ошибки в коде. Недочёт исправлен в этом коммите. Версия 1.1, которая устанавливается через pip, уже несет в себе это исправление.
Отправка видеозаметки (видео в кружочке):
Отправка файла:
Преформатированный текст:
Так как разметка тут немного шалит, приложу ещё и скриншот кода с более понятной подсветкой синтаксиса: 
Ну и напоследок немного улучшим знания, полученные в предыдущем уроке и закрепим их на деле:
Оставим для нерадивого пользователя пару хэндлеров для нежданных сообщений:
Домашнее задание
В качестве домашнего задания предлагаю вам поэкспериментировать и выполнить следующие действия:
Конечные автоматы (FSM)¶
Теория¶
В этой главе мы поговорим о, пожалуй, самой важной возможности ботов: о системе диалогов. К сожалению, далеко не все действия в боте можно выполнить за одно сообщение или команду. Предположим, есть бот для знакомств, где при регистрации нужно указать имя, возраст и отправить фотографию с лицом. Можно, конечно, попросить пользователя отправить фотографию, а в подписи к ней указать все данные, но это неудобно для обработки и запроса повторного ввода.
Теперь представим пошаговый ввод данных, где в начале бот «включает» режим ожидания определённой информации от конкретного юзера, далее на каждом этапе проверяет вводимые данные, а по команде /cancel прекращает ожидать очередной шаг и возвращается в основной режим. Взгляните на схему ниже:
Зелёной стрелкой обозначен процесс перехода по шагам без ошибок, синие стрелки означают сохранение текущего состояния и ожидание повторного ввода (например, если юзер указал, что ему 250 лет, следует запросить возраст заново), а красные показывают выход из всего процесса из-за команды /cancel или любой другой, означающей отмену.
Процесс со схемы выше в теории алгоритмов называется конечным автоматом (или FSM — Finite State Machine). Подробнее об этом можно прочесть здесь.
Практика¶
В качестве примера мы напишем имитатор заказа еды и напитков в кафе, а заодно научимся хранить логически разные хэндлеры в разных файлах.
Примечание об исходных текстах к главе
В тексте будет рассмотрен не весь код бота, некоторые импорты и обработчики специально пропущены для улучшения читабельности. Полный набор исходников можно найти на GitLab или в зеркале на GitHub.
За основу структуры файлов и каталогов взят репозиторий tgbot_template от пользователя Tishka17. В этой главе будет рассмотрен сильно упрощённый вариант его примера, а далее по мере усложнения бота структура файлов будет расширяться.
Спасибо!
Структура файлов и каталогов¶
О модулях, пакетах и каталогах
Создание шагов¶
Рассмотрим описание шагов для «заказа» еды. Для начала в файле app/handlers/food.py импортируем необходимые объекты и приведём списки блюд и их размеров (в реальной жизни эта информация может динамически подгружаться из какой-либо БД):
Напишем обработчик первого шага, реагирующий на команду /food (регистрировать его будем позднее):
Осталось реализовать последнюю функцию, которая отвечает за получение размера порции (с аналогичной проверкой ввода) и вывод результатов пользователю:
Шаги для выбора напитков делаются совершенно аналогично. Попробуйте сделать самостоятельно или загляните в исходные тексты к этой главе.
Общие команды¶
Раз уж заговорили о сбросе состояний, давайте в файле app/handlers/common.py реализуем обработчики команды /start и действия «отмены». Первая должна показывать некий приветственный/справочный текст, а вторая просто пишет «действие отменено». Обе функции сбрасывают состояние и данные и убирают обычную клавиатуру, если вдруг она есть:
Зарегистрируем эти два обработчика:
Точка входа¶
Теперь, вооружившись знаниями о конечных автоматах, вы можете безбоязненно писать ботов с системой диалогов.
aiogram-logging 0.0.1
pip install aiogram-logging Copy PIP instructions
Released: Mar 18, 2021
Simplifies sending logs from your bots to DB.
Navigation
Project links
Statistics
View statistics for this project via Libraries.io, or by using our public dataset on Google BigQuery
License: MIT License (MIT)
Requires: Python >=3.6
Maintainers
Classifiers
Project description
aiogram-logger
Simplifies sending logs from your bots to DB.
Quick start with InfluxDB + Grafana
Install package from pip
Prepare InlfuxDB and Grafana with this repo.
Import and create instances
Create StatMiddleware to logging every incoming message
Create dashboard by yourself or import from grafana-dashboard.json
Yeah, you can connect several bots for one InfluxDB
Project details
Project links
Statistics
View statistics for this project via Libraries.io, or by using our public dataset on Google BigQuery
License: MIT License (MIT)
Requires: Python >=3.6
Maintainers
Classifiers
Download files
Download the file for your platform. If you’re not sure which to choose, learn more about installing packages.












