@V-ampre

Как правильно использовать QueueHandler для отправки логов в телеграм?

Допустим я использую QueueHandler для отправки логов в телеграм:
import logging
from logging.handlers import QueueHandler, QueueListener
from queue import Queue
import requests

class TgHandler(QueueHandler):
    def __init__(self):
        self.queue = Queue(-1)
        super().__init__(self.queue)
        self.handler = MessageHandler()
        self.listener = QueueListener(self.queue, self.handler)
        self.listener.start()

class MessageHandler(logging.Handler):
    api_url = 'https://api.telegram.org/botmy-token/sendMessage'
    chat_id = 123

    def emit(self, record):
        message = self.format(record)
        params = {
            'chat_id': self.chat_id,
            'text': message
        }
        requests.post(self.api_url, json=params)


Но столкнулся с такой проблемой, что отправка сообщений не происходит так как при завершении основного потока он не ждет пока выполнится код в потоке с MessageHandler:
import logging
from logging.config import dictConfig

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'telegram': {
            'class': 'my_logger.TgHandler',
            'level': 'INFO',
        },
    },
    'loggers': {
        'telegram': {
            'handlers': ['telegram'],
            'level': 'INFO',
        }
    }
}

dictConfig(LOGGING)

logger = logging.getLogger('telegram')

try:
    1/0
except ZeroDivisionError as e:
    logger.exception(e, stack_info=True)
    # import time; time.sleep(5) - а вот так все работает 

print('Done!')


Есть ли возможность изменить такое поведение, или я вообще что-то делаю неправильно...?
  • Вопрос задан
  • 196 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Python
бекенд-разработчик на python
С одной стороны, если Ваше приложение живет больше 5 секунд, ваши логи все-таки будут работать - можно забить.
С другой стороны, краши однозначно не попадут в логи: для того чтобы попали, необходимо дождаться обработки всех сообщений в очереди
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы