mirror of
https://github.com/eternnoir/pyTelegramBotAPI.git
synced 2023-08-10 21:12:57 +03:00
Merge pull request #1525 from Badiboy/master
Polling exception logging updated
This commit is contained in:
commit
7d9658b062
@ -542,15 +542,15 @@ class TeleBot:
|
|||||||
for listener in self.update_listener:
|
for listener in self.update_listener:
|
||||||
self._exec_task(listener, new_messages)
|
self._exec_task(listener, new_messages)
|
||||||
|
|
||||||
def infinity_polling(self, timeout: int=20, skip_pending: bool=False, long_polling_timeout: int=20, logger_level=logging.ERROR,
|
def infinity_polling(self, timeout: int=20, skip_pending: bool=False, long_polling_timeout: int=20,
|
||||||
allowed_updates: Optional[List[str]]=None, *args, **kwargs):
|
logger_level=logging.ERROR, allowed_updates: Optional[List[str]]=None, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Wrap polling with infinite loop and exception handling to avoid bot stops polling.
|
Wrap polling with infinite loop and exception handling to avoid bot stops polling.
|
||||||
|
|
||||||
:param timeout: Request connection timeout
|
:param timeout: Request connection timeout
|
||||||
:param long_polling_timeout: Timeout in seconds for long polling (see API docs)
|
:param long_polling_timeout: Timeout in seconds for long polling (see API docs)
|
||||||
:param skip_pending: skip old updates
|
:param skip_pending: skip old updates
|
||||||
:param logger_level: Custom logging level for infinity_polling logging.
|
:param logger_level: Custom (different from logger itself) logging level for infinity_polling logging.
|
||||||
Use logger levels from logging as a value. None/NOTSET = no error logging
|
Use logger levels from logging as a value. None/NOTSET = no error logging
|
||||||
:param allowed_updates: A list of the update types you want your bot to receive.
|
:param allowed_updates: A list of the update types you want your bot to receive.
|
||||||
For example, specify [“message”, “edited_channel_post”, “callback_query”] to only receive updates of these types.
|
For example, specify [“message”, “edited_channel_post”, “callback_query”] to only receive updates of these types.
|
||||||
@ -567,7 +567,7 @@ class TeleBot:
|
|||||||
while not self.__stop_polling.is_set():
|
while not self.__stop_polling.is_set():
|
||||||
try:
|
try:
|
||||||
self.polling(none_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
|
self.polling(none_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout,
|
||||||
allowed_updates=allowed_updates, *args, **kwargs)
|
logger_level=logger_level, allowed_updates=allowed_updates, *args, **kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
if logger_level and logger_level >= logging.ERROR:
|
if logger_level and logger_level >= logging.ERROR:
|
||||||
logger.error("Infinity polling exception: %s", str(e))
|
logger.error("Infinity polling exception: %s", str(e))
|
||||||
@ -580,8 +580,8 @@ class TeleBot:
|
|||||||
if logger_level and logger_level >= logging.INFO:
|
if logger_level and logger_level >= logging.INFO:
|
||||||
logger.error("Break infinity polling")
|
logger.error("Break infinity polling")
|
||||||
|
|
||||||
def polling(self, non_stop: bool=False, skip_pending=False, interval: int=0, timeout: int=20,
|
def polling(self, non_stop: bool=False, skip_pending=False, interval: int=0, timeout: int=20, long_polling_timeout: int=20,
|
||||||
long_polling_timeout: int=20, allowed_updates: Optional[List[str]]=None,
|
logger_level=logging.ERROR, allowed_updates: Optional[List[str]]=None,
|
||||||
none_stop: Optional[bool]=None):
|
none_stop: Optional[bool]=None):
|
||||||
"""
|
"""
|
||||||
This function creates a new Thread that calls an internal __retrieve_updates function.
|
This function creates a new Thread that calls an internal __retrieve_updates function.
|
||||||
@ -596,6 +596,8 @@ class TeleBot:
|
|||||||
:param timeout: Request connection timeout
|
:param timeout: Request connection timeout
|
||||||
:param skip_pending: skip old updates
|
:param skip_pending: skip old updates
|
||||||
:param long_polling_timeout: Timeout in seconds for long polling (see API docs)
|
:param long_polling_timeout: Timeout in seconds for long polling (see API docs)
|
||||||
|
:param logger_level: Custom (different from logger itself) logging level for infinity_polling logging.
|
||||||
|
Use logger levels from logging as a value. None/NOTSET = no error logging
|
||||||
:param allowed_updates: A list of the update types you want your bot to receive.
|
:param allowed_updates: A list of the update types you want your bot to receive.
|
||||||
For example, specify [“message”, “edited_channel_post”, “callback_query”] to only receive updates of these types.
|
For example, specify [“message”, “edited_channel_post”, “callback_query”] to only receive updates of these types.
|
||||||
See util.update_types for a complete list of available update types.
|
See util.update_types for a complete list of available update types.
|
||||||
@ -615,12 +617,20 @@ class TeleBot:
|
|||||||
self.__skip_updates()
|
self.__skip_updates()
|
||||||
|
|
||||||
if self.threaded:
|
if self.threaded:
|
||||||
self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
|
self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
|
||||||
|
logger_level=logger_level, allowed_updates=allowed_updates)
|
||||||
else:
|
else:
|
||||||
self.__non_threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
|
self.__non_threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout,
|
||||||
|
logger_level=logger_level, allowed_updates=allowed_updates)
|
||||||
|
|
||||||
def __threaded_polling(self, non_stop=False, interval=0, timeout = None, long_polling_timeout = None, allowed_updates=None):
|
def __threaded_polling(self, non_stop = False, interval = 0, timeout = None, long_polling_timeout = None,
|
||||||
logger.info('Started polling.')
|
logger_level=logging.ERROR, allowed_updates=None):
|
||||||
|
if not(logger_level) or (logger_level < logging.INFO):
|
||||||
|
warning = "\n Warning: this message appearance will be changed. Set logger_level=logging.INFO to continue seeing it."
|
||||||
|
else:
|
||||||
|
warning = ""
|
||||||
|
#if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info('Started polling.' + warning)
|
||||||
self.__stop_polling.clear()
|
self.__stop_polling.clear()
|
||||||
error_interval = 0.25
|
error_interval = 0.25
|
||||||
|
|
||||||
@ -645,14 +655,17 @@ class TeleBot:
|
|||||||
else:
|
else:
|
||||||
handled = False
|
handled = False
|
||||||
if not handled:
|
if not handled:
|
||||||
logger.error(traceback.format_exc())
|
if logger_level and logger_level >= logging.ERROR:
|
||||||
|
logger.error("Threaded polling exception: %s", str(e))
|
||||||
|
if logger_level and logger_level >= logging.DEBUG:
|
||||||
|
logger.error("Exception traceback:\n%s", traceback.format_exc())
|
||||||
if not non_stop:
|
if not non_stop:
|
||||||
self.__stop_polling.set()
|
self.__stop_polling.set()
|
||||||
logger.info("Exception occurred. Stopping.")
|
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info("Exception occurred. Stopping." + warning)
|
||||||
else:
|
else:
|
||||||
# polling_thread.clear_exceptions()
|
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
# self.worker_pool.clear_exceptions()
|
logger.info("Waiting for {0} seconds until retry".format(error_interval) + warning)
|
||||||
logger.info("Waiting for {0} seconds until retry".format(error_interval))
|
|
||||||
time.sleep(error_interval)
|
time.sleep(error_interval)
|
||||||
if error_interval * 2 < 60:
|
if error_interval * 2 < 60:
|
||||||
error_interval *= 2
|
error_interval *= 2
|
||||||
@ -665,7 +678,8 @@ class TeleBot:
|
|||||||
polling_thread.clear_exceptions() #*
|
polling_thread.clear_exceptions() #*
|
||||||
self.worker_pool.clear_exceptions() #*
|
self.worker_pool.clear_exceptions() #*
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
logger.info("KeyboardInterrupt received.")
|
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info("KeyboardInterrupt received." + warning)
|
||||||
self.__stop_polling.set()
|
self.__stop_polling.set()
|
||||||
break
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -684,12 +698,19 @@ class TeleBot:
|
|||||||
time.sleep(error_interval)
|
time.sleep(error_interval)
|
||||||
|
|
||||||
polling_thread.stop()
|
polling_thread.stop()
|
||||||
polling_thread.clear_exceptions() #*
|
polling_thread.clear_exceptions()
|
||||||
self.worker_pool.clear_exceptions() #*
|
self.worker_pool.clear_exceptions()
|
||||||
logger.info('Stopped polling.')
|
#if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info('Stopped polling.' + warning)
|
||||||
|
|
||||||
def __non_threaded_polling(self, non_stop=False, interval=0, timeout=None, long_polling_timeout=None, allowed_updates=None):
|
def __non_threaded_polling(self, non_stop=False, interval=0, timeout=None, long_polling_timeout=None,
|
||||||
logger.info('Started polling.')
|
logger_level=logging.ERROR, allowed_updates=None):
|
||||||
|
if not(logger_level) or (logger_level < logging.INFO):
|
||||||
|
warning = "\n Warning: this message appearance will be changed. Set logger_level=logging.INFO to continue seeing it."
|
||||||
|
else:
|
||||||
|
warning = ""
|
||||||
|
#if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info('Started polling.' + warning)
|
||||||
self.__stop_polling.clear()
|
self.__stop_polling.clear()
|
||||||
error_interval = 0.25
|
error_interval = 0.25
|
||||||
|
|
||||||
@ -704,18 +725,24 @@ class TeleBot:
|
|||||||
handled = False
|
handled = False
|
||||||
|
|
||||||
if not handled:
|
if not handled:
|
||||||
logger.error(e)
|
if logger_level and logger_level >= logging.ERROR:
|
||||||
|
logger.error("Polling exception: %s", str(e))
|
||||||
|
if logger_level and logger_level >= logging.DEBUG:
|
||||||
|
logger.error("Exception traceback:\n%s", traceback.format_exc())
|
||||||
if not non_stop:
|
if not non_stop:
|
||||||
self.__stop_polling.set()
|
self.__stop_polling.set()
|
||||||
logger.info("Exception occurred. Stopping.")
|
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info("Exception occurred. Stopping." + warning)
|
||||||
else:
|
else:
|
||||||
logger.info("Waiting for {0} seconds until retry".format(error_interval))
|
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info("Waiting for {0} seconds until retry".format(error_interval) + warning)
|
||||||
time.sleep(error_interval)
|
time.sleep(error_interval)
|
||||||
error_interval *= 2
|
error_interval *= 2
|
||||||
else:
|
else:
|
||||||
time.sleep(error_interval)
|
time.sleep(error_interval)
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
logger.info("KeyboardInterrupt received.")
|
# if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
|
logger.info("KeyboardInterrupt received." + warning)
|
||||||
self.__stop_polling.set()
|
self.__stop_polling.set()
|
||||||
break
|
break
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -727,8 +754,8 @@ class TeleBot:
|
|||||||
raise e
|
raise e
|
||||||
else:
|
else:
|
||||||
time.sleep(error_interval)
|
time.sleep(error_interval)
|
||||||
|
#if logger_level and logger_level >= logging.INFO: # enable in future releases. Change output to logger.error
|
||||||
logger.info('Stopped polling.')
|
logger.info('Stopped polling.' + warning)
|
||||||
|
|
||||||
def _exec_task(self, task, *args, **kwargs):
|
def _exec_task(self, task, *args, **kwargs):
|
||||||
if kwargs and kwargs.get('task_type') == 'handler':
|
if kwargs and kwargs.get('task_type') == 'handler':
|
||||||
@ -3876,7 +3903,7 @@ class TeleBot:
|
|||||||
"""
|
"""
|
||||||
Check middleware
|
Check middleware
|
||||||
|
|
||||||
:param message:
|
:param update_type:
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
middlewares = None
|
middlewares = None
|
||||||
|
Loading…
Reference in New Issue
Block a user