HFCNotificator/errlogging.py

111 lines
2.4 KiB
Python
Raw Normal View History

import datetime
2023-10-30 13:30:36 +02:00
import logging
import os
import sys
import traceback
2023-10-30 15:58:20 +02:00
import __main__
from pathlib import Path
main_dir = Path(__main__.__file__).parent
botdata_dir = main_dir.joinpath('botdata')
errlog_dir = botdata_dir.joinpath('errlogs')
2023-10-30 13:30:36 +02:00
class ErrLogger:
def __init__(self, handler: logging.Handler=None):
if handler is None:
handler = logging.StreamHandler()
2023-10-30 13:30:36 +02:00
self.log = logging.Logger('ErrLogger')
self.log.addHandler(handler)
2023-10-30 13:30:36 +02:00
def new_errlog(self, err: BaseException):
self.log.error('An error has occurred! Check the latest ERRLOG file for more info.')
e: BaseException = err
time = datetime.datetime.now()
2023-10-30 15:58:20 +02:00
path = os.path.join(errlog_dir,
2023-10-30 13:30:36 +02:00
f'ERRLOG_{time.strftime("%Y-%m-%d_%H-%M-%S")}.txt')
2023-11-05 20:26:29 +02:00
tb_str = ''
context_ls = list()
context_ls.append(e)
ctx = e.__context__
if ctx is not None:
2023-11-05 20:26:29 +02:00
context_ls.append(ctx)
context_str = '\n'.join([context.__str__() for context in context_ls])
tb_str = '\n\n'.join(
['\n'.join(traceback.format_tb(exc.__traceback__)) for exc in context_ls]
)
2023-10-30 13:30:36 +02:00
data = f"""An error has occurred! Don't worry, I saved an automatic log for ya :)
----------------------------------------------------------------------
Rough DateTime: {time.strftime("%Y-%m-%d %H:%M:%S")}
Error Info:
-----------
{type(e).__name__}: {e}
Context:
2023-11-05 20:26:29 +02:00
{context_str}
Caused by:
{e.__cause__}
Full Traceback:
---------------
{tb_str}
"""
2023-10-30 13:30:36 +02:00
with open(path, 'w') as f:
f.write(data)
def errlog(self, func):
def wrapper(*args, **kwargs):
try:
res = func(*args, **kwargs)
except Exception as e:
self.new_errlog(e)
else:
return res
return wrapper
def async_errlog(self, func):
async def wrapper(*args, **kwargs):
try:
res = await func(*args, **kwargs)
except Exception as e:
self.new_errlog(e)
else:
return res
return wrapper
def generate_errlog_folder():
2023-10-30 15:58:20 +02:00
if not botdata_dir.is_dir():
botdata_dir.mkdir()
2023-10-30 13:30:36 +02:00
2023-10-30 15:58:20 +02:00
if not errlog_dir.is_dir():
errlog_dir.mkdir()
2023-10-30 13:30:36 +02:00
def new_errlog(err: BaseException):
ErrLogger().new_errlog(err)
def errlog(func):
2023-10-30 13:30:36 +02:00
return ErrLogger().errlog(func)
def async_errlog(func):
return ErrLogger().async_errlog(func)