LoggerSetup-module/setup_logger.py

65 lines
2.8 KiB
Python

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