Модуль logging в питоне - это мощный инструмент в разработке. Он помогает отследить ошибки, наблюдать за работой приложения и даже собирать статистику об использовании вашего сервиса. В этой статье я расскажу, как можно расширить возможности этого модуля и причем тут телеграмм.
![](https://habrastorage.org/getpro/habr/upload_files/05e/0d4/0fc/05e0d40fc02f0d33241f7274f99854d9.jpeg)
Intro
Давным-давно, а точнее несколько месяцев назад, накануне Нового года, я сидел дома и решал задачу по машинному обучению. Связана она была с нейронными сетями и классификацией текстов, поэтому я естественно пользовался бесплатным GPU от гугла (colab). За окном шел снег, а модели обучались ну уж очень долго. Обучать модель оставалось всего несколько минут, как вдруг появляется уведомление, что подключение к runtime потеряно, а это значит, что обученную модель и сабмиты из этого runtime скачать я не смогу, и все придется начинать заново.
![](https://habrastorage.org/getpro/habr/upload_files/708/d33/b4f/708d33b4f9b0549af7dcfb3ea2abd31e.png)
Данная ситуация меня расстроила и заставила задуматься от том, что надо как-то через код сохранять файлы, потому что процесс выполнения кода не прекращается, когда возникает такая ошибка. Почему-то я сразу подумал про телеграм ботов и, написав несколько функций, смог сохранять самбиты и промежуточную информацию о том, как обучается модель и сколько ей осталось.
![](https://habrastorage.org/getpro/habr/upload_files/bde/727/133/bde727133f0dbee6013b14954e29453e.jpeg)
Копировал я этот код из ноутбука (jupyter notebook) в ноутбук, а потом осознал, что это можно встроить в модуль logging и завернуть в библиотеку, чтобы не таскать каждый раз большие куски кода, а использовать всего пару строк.
Logging.handlers
Понятно было, что за основу надо взять модуль для логирования, встроенный в питон. Очевидно, потому что изобретать свой велосипед мне не хотелось, а еще потому что, для использования в приложениях пришлось бы переписывать весь код логирования. Надо было найти способ перехватывать логи, и пересылать их в телеграмм. К счастью, в logging есть такой класс, как StreamHandler. Не буду вдаваться в подробности, но с помощью него можно сделать свою функцию, которая будет запускаться для каждой новой строки в логах и отправлять ее в телеграмм.
Tg-logger
И вот, держа в голове все вышеописанные идеи, я отправился писать свою библиотеку. Вот, что получилось.
Для тех, кому лень запускать код, но хочется понять, как это будет работать, я сделал бота @tg_logger_demo_bot.
![](https://habrastorage.org/getpro/habr/upload_files/b4a/162/0f0/b4a1620f06069af3ba96959186b29e5f.png)
Чтобы воспользоваться библиотекой нужно:
создать телеграмм бота (как это сделать описано здесь)
получить свой user_id (это можно сделать через @tg_logger_demo_bot с помощью команды
/id
)
Установим библиотеку через pip.
pip install tg-logger
Рассмотрим код примера
import logging
import tg_logger
# Telegram data
token = "1234567890:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
users = [1111111111]
# Base logger
logger = logging.getLogger('foo')
logger.setLevel(logging.INFO)
# Logging bridge setup
tg_logger.setup(logger, token=token, users=users)
# Test
logger.info("Hello from tg_logger by otter18")
Особо интересна для нас строка, в которой подключается логирование в телеграмм.
# Logging bridge setup
tg_logger.setup(logger, token=token, users=users)
В функцию setup() нужно просто передать тот logger, к которому вы хотите подключить мост. Если заглянуть в документацию, то можно посмотреть на другие параметры функции setup(). С помощью них можно, в частности, настроить формат, в котором логи будут отправлены.
![](https://habrastorage.org/getpro/habr/upload_files/d1e/978/b26/d1e978b261ef143c938c3ae93772bbdc.png)
TgFileLogger
Стоит также упомянуть, что функцию отправки файлов я тоже добавил.
import tg_logger
# Telegram data
token = "1234567890:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
users = [1111111111]
# TgFileLogger example
tg_files_logger = tg_logger.TgFileLogger(
token=token, # tg bot token
users=users, # list of user_id
timeout=10 # 10 seconds by default
)
file_name = "test.txt"
with open(file_name, 'w') as example_file:
example_file.write("Hello from tg_logger by otter18")
tg_files_logger.send(file_name, "Test file")
![](https://habrastorage.org/getpro/habr/upload_files/f8c/6bb/4b0/f8c6bb4b0dce5a57ac5626ebab43cc83.png)
Outro
Весь исходный код есть на гитхабе: github.com/otter18/tg_logger.
Документация на английском есть на Read the Docs.
Библиотека доступна для скачивания через pip: pypi.org/project/tg-logger/.
VSOP_juDGe
Отличная идея!
Интересно, у телеграма есть лимиты на объем сообщений? Как насчет нескольких гигабайт логов в день?)
censor2005
Есть лимит на 30 сообщений в секунду. Насколько я знаю, есть также лимит на одно сообщение, порядка 4кб. По моим прикидкам, выходит около 10гб в день.