import glob import os import sys import threading import traceback import zipfile from datetime import datetime from tkinter import messagebox from loguru import logger from core import Core 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.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.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) os.makedirs(Core.DIR / "cache", exist_ok=True) 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) logger.remove() fmt = "{elapsed} -- {time:YYYY-MM-DD HH:mm:ss.SSS} | {level:<8} | {extra[module]:^12} | {extra[prefix]:<12} | {message}" logger.add(sys.stdout, level="DEBUG", format=fmt, backtrace=True, diagnose=True) logger.add(log_file, level="INFO", format=fmt, backtrace=False, diagnose=False, rotation="25 MB") logger.add(log_dir / "debug.log", level="DEBUG", format=fmt, rotation="10 MB") logger.add(log_dir / "low_debug.log", level="DEBUG", rotation="10 MB") sys.excepthook = handle_exception threading.excepthook = handle_thread_exception logger.bind(module="LoggerSetup", prefix="init").success("Logger initialized.")