import glob import multiprocessing 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(): if multiprocessing.current_process().name != "MainProcess": return 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 if multiprocessing.current_process().name != "MainProcess": logger.bind(module="subproc", prefix="init").debug(f"Process id: {multiprocessing.current_process().pid} Started in {multiprocessing.current_process().name}") else: logger.bind(module="LoggerSetup", prefix="init").success("Logger initialized.")