Допустим я использую 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!')
Есть ли возможность изменить такое поведение, или я вообще что-то делаю неправильно...?