fix for logger
This commit is contained in:
parent
88d526aa00
commit
3849e3fc2d
|
|
@ -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,24 +18,22 @@ 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
|
||||||
try:
|
os.makedirs(LOG_DIR, exist_ok=True)
|
||||||
# when="midnight": Rotiert jede Nacht um 00:00 Uhr
|
|
||||||
# backupCount=30: Behält Logs für 30 Tage
|
|
||||||
file_handler = TimedRotatingFileHandler(
|
file_handler = TimedRotatingFileHandler(
|
||||||
LOG_FILE,
|
LOG_FILE,
|
||||||
when="midnight",
|
when="midnight",
|
||||||
|
|
@ -45,35 +42,38 @@ if os.path.exists(LOG_DIR):
|
||||||
encoding='utf-8'
|
encoding='utf-8'
|
||||||
)
|
)
|
||||||
file_handler.setFormatter(formatter)
|
file_handler.setFormatter(formatter)
|
||||||
# Suffix für rotierte Dateien: worker.log.2023-10-27
|
|
||||||
file_handler.suffix = "%Y-%m-%d"
|
file_handler.suffix = "%Y-%m-%d"
|
||||||
logger.addHandler(file_handler)
|
logger.addHandler(file_handler)
|
||||||
except Exception as e:
|
|
||||||
print(f"⚠ Logging Setup Error: Could not create file handler: {e}")
|
# 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'):
|
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)
|
||||||
Loading…
Reference in New Issue