import glob import os import sys import threading import traceback import zipfile from datetime import datetime from tkinter import messagebox from core import Core from loguru import logger def handle_exception(exc_type, exc_value, exc_traceback): if issubclass(exc_type, KeyboardInterrupt) or issubclass(exc_type, SystemExit): sys.__excepthook__(exc_type, exc_value, exc_traceback) return logger.bind(module="Error", prefix="unhandled").error("Unhandled exception:\n" + "".join(traceback.format_exception(exc_type, exc_value, exc_traceback))) def handle_thread_exception(args): exc_type, exc_value, exc_traceback = args.exc_type, args.exc_value, args.exc_traceback if issubclass(exc_type, KeyboardInterrupt) or issubclass(exc_type, SystemExit): return logger.bind(module="ThreadError", prefix="unhandled").error("Unhandled exception in thread:\n" + "".join(traceback.format_exception(exc_type, exc_value, exc_traceback))) log_dir = Core.DIR / "logs" log_file = log_dir / "info.log" os.makedirs(log_dir, exist_ok=True) def zip_logs(): try: if os.path.exists(log_file): ftime = os.path.getmtime(log_file) index = 1 while True: zip_path = log_dir / f"{datetime.fromtimestamp(ftime).strftime('%Y-%m-%d')}-{index}.zip" if not os.path.exists(zip_path): break index += 1 with zipfile.ZipFile(zip_path, "w") as zipf: logs_files = glob.glob(f"{log_dir}/*.log") for file in logs_files: if os.path.exists(file): zipf.write(file, os.path.basename(file)) os.remove(file) except PermissionError: messagebox.showerror(f"ezSyncer {Core.ver_str}", "Some files are locked...\nProgram cannot works in multiplies instances.") sys.exit(1) def setup(console_debug=False, file_debug=False, file_low_debug=False, module_set="^12", prefix_set="<12"): logger.remove() logger.level("EVCALL", no=9, color="") fmt = "{elapsed} -- {time:YYYY-MM-DD HH:mm:ss.SSS} | {level:<8} | {extra[module]:%s} | {extra[prefix]:%s} | {message}" % (module_set, prefix_set) if sys.stdout: logger.add(sys.stdout, level="DEBUG" if console_debug else "INFO", format=fmt, backtrace=True, diagnose=True) logger.add(log_file, level="INFO", format=fmt, backtrace=False, diagnose=False, rotation="25 MB") if file_debug: logger.add(log_dir / "debug.log", level=0, format=fmt, rotation="10 MB") if file_low_debug: logger.add(log_dir / "low_debug.log", level=0, rotation="10 MB") sys.excepthook = handle_exception threading.excepthook = handle_thread_exception logger.bind(module="LoggerSetup", prefix="init").success("Logger initialized.")