LoggerSetup-module/setup_logger.py
2025-03-18 14:40:55 +03:00

60 lines
2.4 KiB
Python

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 = "<green>{elapsed} -- {time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level:<8}</level> | {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.")