To answer the question from Mr.Zeus discussed in the comment section of the accepted answer, I use this to log uncaught exceptions in an interactive console (tested with PyCharm 2018-2019). I found out sys.excepthook does not work in a python shell so I looked deeper and found that I could use sys.exc_info instead. However, sys.exc_info takes no arguments unlike sys.excepthook that takes 3 arguments.
Here, I use both sys.excepthook and sys.exc_info to log both exceptions in an interactive console and a script with a wrapper function. To attach a hook function to both functions, I have two different interfaces depending if arguments are given or not.
Here's the code:
def log_exception(exctype, value, traceback): logger.error("Uncaught exception occurred!", exc_info=(exctype, value, traceback)) def attach_hook(hook_func, run_func): def inner(*args, **kwargs): if not (args or kwargs): # This condition is for sys.exc_info local_args = run_func() hook_func(*local_args) else: # This condition is for sys.excepthook hook_func(*args, **kwargs) return run_func(*args, **kwargs) return inner sys.exc_info = attach_hook(log_exception, sys.exc_info) sys.excepthook = attach_hook(log_exception, sys.excepthook)
The logging setup can be found in gnu_lorien's answer.