Логи

· nikoontelegram's blog


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

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

 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

Здесь мы видим, что помимо информации о старте приложения, вывод которой добавили мы сами, выводятся и другие строки. Эти логи прилетают нам изнутри библиотеки и добавлены её авторами для упрощения жизни пользователям. Что полезного можно из этого извлечь:

Более детально про модуль logging можно почитать в документации


Мой канал про разработку под телеграм: @NikoOnTelegram