import logging import yaml import traceback from logging.handlers import TimedRotatingFileHandler, RotatingFileHandler # === ANSI-Farbcodes für Konsole === RESET = "\x1b[0m" # Farbe zurücksetzen RED = "\x1b[31m" # Fehler: Rot YELLOW = "\x1b[33m" # Warnung: Gelb GREEN = "\x1b[32m" # Info: Grün BLUE = "\x1b[34m" # Debug: Blau class CustomFormatter(logging.Formatter): def format(self, record): if record.levelno >= logging.ERROR and record.exc_info: record.msg = f"{record.msg}\n{traceback.format_exc()}" # Farbe nach Level if record.levelno == logging.DEBUG: record.msg = f"{BLUE}{record.msg}{RESET}" elif record.levelno == logging.INFO: record.msg = f"{GREEN}{record.msg}{RESET}" elif record.levelno == logging.WARNING: record.msg = f"{YELLOW}{record.msg}{RESET}" elif record.levelno >= logging.ERROR: record.msg = f"{RED}{record.msg}{RESET}" return super().format(record) class Settings: def __init__(self): self.yaml = None self.read() def read(self): with open("app/cfg/settings.yaml", "r", encoding="utf-8") as file: self.yaml = yaml.safe_load(file) def write(self): with open("app/cfg/settings.yaml", "w", encoding="utf8") as file: yaml.dump(self.yaml, file, default_flow_style=False, indent=4) def set_logging(self): log_level = self.yaml.get("log_level", "INFO") log_file = self.yaml.get("log_file", "app.log") log_mode = self.yaml.get("log_rotation", "size") # "time" oder "size" handlers = [logging.StreamHandler()] # Handler je nach Modus erstellen if log_mode == "time": log_handler = TimedRotatingFileHandler( f"app/logs/{log_file}", when="midnight", interval=1, backupCount=7, encoding="utf-8" ) else: log_handler = RotatingFileHandler( f"app/logs/{log_file}", maxBytes=5 * 1024 * 1024, backupCount=5, encoding="utf-8" ) handlers.append(log_handler) # Logger konfigurieren logging.basicConfig( level=log_level, format="%(asctime)s - %(levelname)s - %(message)s", handlers=handlers ) # Traceback-Formatter setzen formatter = CustomFormatter("%(asctime)s - %(levelname)s - %(message)s") for handler in logging.getLogger().handlers: handler.setFormatter(formatter)