Эта заметка посвящена простому совету, который сильно облегчает мне жизнь во время написания кода вообще, и телеграм-ботов в частности.
В предыдущей заметке мы остановились на том, что создали простейшего бота:
1from aiogram import Bot, Dispatcher
2from aiogram.filters import CommandStart
3
4TOKEN = "<TOKEN>"
5
6dp = Dispatcher()
7bot = Bot(TOKEN)
8
9
10@dp.message(CommandStart())
11async def command_start_handler(message):
12 await message.answer(f"Hello, {message.from_user.full_name}!")
13
14
15@dp.message()
16async def echo_handler(message):
17 await message.answer(message.text)
18
19dp.run_polling(bot)
Запустив его вы могли обнаружить, что даже факт начала его работы не совсем очевиден, так как при запуске он не выдаёт никакой информации. Да и в процессе работы было бы полезно видеть то, что он не завис, а просто ждёт событий для обработки. Решить эту проблему нам поможет запись происходящих в программе событий, она же логирование.
Дополним нашего бота несколькими строками:
1+import logging
2
3from aiogram import Bot, Dispatcher
4from aiogram.filters import CommandStart
5
6TOKEN = "<TOKEN>"
7
8+# включение логирования
9+logging.basicConfig(
10+ level=logging.INFO,
11+ format="%(asctime)s: "
12+ "%(filename)s: "
13+ "%(levelname)s: "
14+ "%(funcName)s(): "
15+ "%(lineno)d:\t"
16+ "%(message)s",
17+)
18
19
20dp = Dispatcher()
21bot = Bot(TOKEN)
22
23
24@dp.message(CommandStart())
25async def command_start_handler(message):
26 await message.answer(f"Hello, {message.from_user.full_name}!")
27
28
29@dp.message()
30async def echo_handler(message):
31 await message.answer(message.text)
32
33+logging.info("Application started")
34dp.run_polling(bot)
35
И посмотрим на то, как изменился вывод программы при запуске:
2023-04-12 18:17:38,989: main.py: INFO: <module>(): 33: Application started
2023-04-12 18:17:38,991: dispatcher.py: INFO: start_polling(): 493: Start polling
2023-04-12 18:17:39,477: dispatcher.py: INFO: _polling(): 329: Run polling for bot @botname
2023-04-12 18:21:12,362: dispatcher.py: INFO: feed_update(): 160: Update id=132190342 is handled. Duration 619 ms by bot id=6183596622
Здесь мы видим, что помимо информации о старте приложения, вывод которой добавили мы сами, выводятся и другие строки. Эти логи прилетают нам изнутри библиотеки и добавлены её авторами для упрощения жизни пользователям. Что полезного можно из этого извлечь:
- Время старта бота
- Режим в котором он получает обновления (Start polling)
- Как называется запущеный бот
- Последняя строка относится уже к действию пользователя, и из неё мы видим что оно было обработано ботом, и сколько времени заняла обработка.
Более детально про модуль logging
можно почитать в документации