fix for logger

This commit is contained in:
Andreas Knuth 2026-02-09 15:59:29 -06:00
parent 88d526aa00
commit 3849e3fc2d
1 changed files with 34 additions and 34 deletions

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Structured logging for email worker with Daily Rotation Structured logging for email worker with Daily Rotation (Robust Version)
""" """
import os import os
@ -8,7 +8,6 @@ import sys
import logging import logging
import threading import threading
from logging.handlers import TimedRotatingFileHandler from logging.handlers import TimedRotatingFileHandler
from datetime import datetime
# Konfiguration # Konfiguration
LOG_DIR = "/var/log/email-worker" LOG_DIR = "/var/log/email-worker"
@ -19,61 +18,62 @@ logger = logging.getLogger("unified-worker")
logger.setLevel(logging.INFO) logger.setLevel(logging.INFO)
logger.propagate = False logger.propagate = False
# Formatierung definieren: [Timestamp] [Level] [Thread] Nachricht # Formatierung
# Hinweis: worker_name wird in der Funktion 'log' manuell eingefügt
formatter = logging.Formatter( formatter = logging.Formatter(
'[%(asctime)s] [%(levelname)s] [%(threadName)s] %(message)s', '[%(asctime)s] [%(levelname)s] [%(threadName)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S' datefmt='%Y-%m-%d %H:%M:%S'
) )
# 1. Console Handler (damit 'docker logs' weiterhin etwas anzeigt) # 1. Console Handler (Immer aktiv!)
console_handler = logging.StreamHandler(sys.stdout) console_handler = logging.StreamHandler(sys.stdout)
console_handler.setFormatter(formatter) console_handler.setFormatter(formatter)
logger.addHandler(console_handler) logger.addHandler(console_handler)
# 2. File Handler mit täglicher Rotation # 2. File Handler (Robustes Setup)
# Prüfen, ob das Verzeichnis schreibbar ist (durch Docker Volume Mount) try:
if os.path.exists(LOG_DIR): # 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: try:
# when="midnight": Rotiert jede Nacht um 00:00 Uhr error_msg += f" Current User (UID): {os.getuid()}\n"
# backupCount=30: Behält Logs für 30 Tage error_msg += f" Current Group (GID): {os.getgid()}\n"
file_handler = TimedRotatingFileHandler( except:
LOG_FILE, pass
when="midnight", print(error_msg)
interval=1,
backupCount=30,
encoding='utf-8'
)
file_handler.setFormatter(formatter)
# Suffix für rotierte Dateien: worker.log.2023-10-27
file_handler.suffix = "%Y-%m-%d"
logger.addHandler(file_handler)
except Exception as e:
print(f"⚠ Logging Setup Error: Could not create file handler: {e}")
def log(message: str, level: str = 'INFO', worker_name: str = 'unified-worker'): def log(message: str, level: str = 'INFO', worker_name: str = 'unified-worker'):
""" """
Structured logging with timestamp and thread info. Structured logging function
Drop-In Replacement for original print-based logging.
""" """
# Mapping von String-Levels zu logging Konstanten
lvl_map = { lvl_map = {
'DEBUG': logging.DEBUG, 'DEBUG': logging.DEBUG,
'INFO': logging.INFO, 'INFO': logging.INFO,
'WARNING': logging.WARNING, 'WARNING': logging.WARNING,
'ERROR': logging.ERROR, 'ERROR': logging.ERROR,
'CRITICAL': logging.CRITICAL, 'CRITICAL': logging.CRITICAL,
'SUCCESS': logging.INFO # 'SUCCESS' gibt es im Standard nicht, wir nutzen INFO 'SUCCESS': logging.INFO
} }
log_level = lvl_map.get(level.upper(), logging.INFO) log_level = lvl_map.get(level.upper(), logging.INFO)
prefix = "[SUCCESS] " if level.upper() == 'SUCCESS' else ""
# Prefix für SUCCESS Level manuell hinzufügen, da es im Standard-Logging fehlt
prefix = ""
if level.upper() == 'SUCCESS':
prefix = "[SUCCESS] "
# Den worker_name in die Nachricht integrieren
final_message = f"[{worker_name}] {prefix}{message}" final_message = f"[{worker_name}] {prefix}{message}"
logger.log(log_level, final_message) logger.log(log_level, final_message)