#!/usr/bin/env python3 """ Structured logging for email worker with Daily Rotation (Robust Version) """ import os import sys import logging import threading from logging.handlers import TimedRotatingFileHandler # Konfiguration LOG_DIR = "/var/log/email-worker" LOG_FILE = os.path.join(LOG_DIR, "worker.log") # Logger initialisieren logger = logging.getLogger("unified-worker") logger.setLevel(logging.INFO) logger.propagate = False # Formatierung formatter = logging.Formatter( '[%(asctime)s] [%(levelname)s] [%(threadName)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 1. Console Handler (Immer aktiv!) console_handler = logging.StreamHandler(sys.stdout) console_handler.setFormatter(formatter) logger.addHandler(console_handler) # 2. File Handler (Robustes Setup) try: # Versuchen, das Verzeichnis zu erstellen, falls es fehlt os.makedirs(LOG_DIR, exist_ok=True) file_handler = TimedRotatingFileHandler( LOG_FILE, when="midnight", interval=1, backupCount=30, encoding='utf-8' ) file_handler.setFormatter(formatter) file_handler.suffix = "%Y-%m-%d" logger.addHandler(file_handler) # Erfolgsmeldung auf Konsole (damit wir sehen, dass es geklappt hat) print(f"✓ Logging to file enabled: {LOG_FILE}") except Exception as e: # Fallback: Ausführliche Fehlerdiagnose auf stdout error_msg = f"⚠ LOGGING ERROR: Could not write to {LOG_FILE}\n" error_msg += f" Error: {e}\n" try: error_msg += f" Current User (UID): {os.getuid()}\n" error_msg += f" Current Group (GID): {os.getgid()}\n" except: pass print(error_msg) def log(message: str, level: str = 'INFO', worker_name: str = 'unified-worker'): """ Structured logging function """ lvl_map = { 'DEBUG': logging.DEBUG, 'INFO': logging.INFO, 'WARNING': logging.WARNING, 'ERROR': logging.ERROR, 'CRITICAL': logging.CRITICAL, 'SUCCESS': logging.INFO } log_level = lvl_map.get(level.upper(), logging.INFO) prefix = "[SUCCESS] " if level.upper() == 'SUCCESS' else "" final_message = f"[{worker_name}] {prefix}{message}" logger.log(log_level, final_message)