📚 Improved logging structure & efficiency across backend logs 🌐 #123
This commit is contained in:
128
backend/app.py
128
backend/app.py
@@ -151,7 +151,19 @@ from utils.multi_location_system import (
|
||||
# Drucker-Monitor importieren
|
||||
from utils.printer_monitor import printer_monitor
|
||||
|
||||
# Timeout Force-Quit Manager importieren
|
||||
# Logging initialisieren (früh, damit andere Module es verwenden können)
|
||||
setup_logging()
|
||||
log_startup_info()
|
||||
|
||||
# app_logger für verschiedene Komponenten (früh definieren)
|
||||
app_logger = get_logger("app")
|
||||
auth_logger = get_logger("auth")
|
||||
jobs_logger = get_logger("jobs")
|
||||
printers_logger = get_logger("printers")
|
||||
user_logger = get_logger("user")
|
||||
kiosk_logger = get_logger("kiosk")
|
||||
|
||||
# Timeout Force-Quit Manager importieren (nach Logger-Definition)
|
||||
try:
|
||||
from utils.timeout_force_quit_manager import (
|
||||
get_timeout_manager, start_force_quit_timeout, cancel_force_quit_timeout,
|
||||
@@ -164,6 +176,108 @@ except ImportError as e:
|
||||
TIMEOUT_FORCE_QUIT_AVAILABLE = False
|
||||
app_logger.warning(f"⚠️ Timeout Force-Quit Manager nicht verfügbar: {e}")
|
||||
|
||||
# ===== AGGRESSIVE SOFORT-SHUTDOWN HANDLER FÜR STRG+C =====
|
||||
import atexit
|
||||
|
||||
def aggressive_shutdown_handler(sig, frame):
|
||||
"""
|
||||
Aggressiver Signal-Handler für sofortiges Herunterfahren bei Strg+C.
|
||||
Schließt sofort alle Datenbankverbindungen und beendet das Programm um jeden Preis.
|
||||
"""
|
||||
print("\n🚨 STRG+C ERKANNT - SOFORTIGES SHUTDOWN!")
|
||||
print("🔥 Schließe Datenbank sofort und beende Programm um jeden Preis!")
|
||||
|
||||
try:
|
||||
# 1. Sofort alle Datenbank-Sessions und Engine schließen
|
||||
try:
|
||||
from models import _engine, _scoped_session, _session_factory
|
||||
|
||||
if _scoped_session:
|
||||
try:
|
||||
_scoped_session.remove()
|
||||
print("✅ Scoped Sessions geschlossen")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Fehler beim Schließen der Scoped Sessions: {e}")
|
||||
|
||||
if _engine:
|
||||
try:
|
||||
_engine.dispose()
|
||||
print("✅ Datenbank-Engine geschlossen")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Fehler beim Schließen der Engine: {e}")
|
||||
except ImportError:
|
||||
print("⚠️ Models nicht verfügbar für Database-Cleanup")
|
||||
|
||||
# 2. Alle offenen DB-Sessions forciert schließen
|
||||
try:
|
||||
import gc
|
||||
# Garbage Collection für nicht geschlossene Sessions
|
||||
gc.collect()
|
||||
print("✅ Garbage Collection ausgeführt")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Garbage Collection fehlgeschlagen: {e}")
|
||||
|
||||
# 3. SQLite WAL-Dateien forciert synchronisieren
|
||||
try:
|
||||
import sqlite3
|
||||
from config.settings import DATABASE_PATH
|
||||
conn = sqlite3.connect(DATABASE_PATH, timeout=1.0)
|
||||
conn.execute("PRAGMA wal_checkpoint(TRUNCATE)")
|
||||
conn.close()
|
||||
print("✅ SQLite WAL-Checkpoint ausgeführt")
|
||||
except Exception as e:
|
||||
print(f"⚠️ WAL-Checkpoint fehlgeschlagen: {e}")
|
||||
|
||||
# 4. Queue Manager stoppen falls verfügbar
|
||||
try:
|
||||
from utils.queue_manager import stop_queue_manager
|
||||
stop_queue_manager()
|
||||
print("✅ Queue Manager gestoppt")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Queue Manager Stop fehlgeschlagen: {e}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Fehler beim Database-Cleanup: {e}")
|
||||
|
||||
print("🛑 SOFORTIGES PROGRAMM-ENDE - EXIT CODE 0")
|
||||
# Sofortiger Exit ohne weitere Cleanup-Routinen
|
||||
os._exit(0)
|
||||
|
||||
def register_aggressive_shutdown():
|
||||
"""
|
||||
Registriert den aggressiven Shutdown-Handler für alle relevanten Signale.
|
||||
Muss VOR allen anderen Signal-Handlern registriert werden.
|
||||
"""
|
||||
# Signal-Handler für alle Plattformen registrieren
|
||||
signal.signal(signal.SIGINT, aggressive_shutdown_handler) # Strg+C
|
||||
signal.signal(signal.SIGTERM, aggressive_shutdown_handler) # Terminate Signal
|
||||
|
||||
# Windows-spezifische Signale
|
||||
if os.name == 'nt':
|
||||
try:
|
||||
signal.signal(signal.SIGBREAK, aggressive_shutdown_handler) # Strg+Break
|
||||
print("✅ Windows SIGBREAK Handler registriert")
|
||||
except AttributeError:
|
||||
pass # SIGBREAK nicht auf allen Windows-Versionen verfügbar
|
||||
else:
|
||||
# Unix/Linux-spezifische Signale
|
||||
try:
|
||||
signal.signal(signal.SIGHUP, aggressive_shutdown_handler) # Hangup Signal
|
||||
print("✅ Unix SIGHUP Handler registriert")
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
# Atexit-Handler als Backup registrieren
|
||||
atexit.register(lambda: print("🔄 Atexit-Handler ausgeführt - Programm beendet"))
|
||||
|
||||
print("🚨 AGGRESSIVER STRG+C SHUTDOWN-HANDLER AKTIVIERT")
|
||||
print("📋 Bei Strg+C wird die Datenbank sofort geschlossen und das Programm beendet!")
|
||||
|
||||
# Aggressive Shutdown-Handler sofort registrieren
|
||||
register_aggressive_shutdown()
|
||||
|
||||
# ===== ENDE AGGRESSIVE SHUTDOWN HANDLER =====
|
||||
|
||||
# Flask-App initialisieren
|
||||
app = Flask(__name__)
|
||||
app.secret_key = SECRET_KEY
|
||||
@@ -380,18 +494,6 @@ def format_datetime_filter(value, format='%d.%m.%Y %H:%M'):
|
||||
return value
|
||||
return value.strftime(format)
|
||||
|
||||
# Logging initialisieren
|
||||
setup_logging()
|
||||
log_startup_info()
|
||||
|
||||
# app_logger für verschiedene Komponenten
|
||||
app_logger = get_logger("app")
|
||||
auth_logger = get_logger("auth")
|
||||
jobs_logger = get_logger("jobs")
|
||||
printers_logger = get_logger("printers")
|
||||
user_logger = get_logger("user")
|
||||
kiosk_logger = get_logger("kiosk")
|
||||
|
||||
# HTTP-Request/Response-Middleware für automatisches Debug-Logging
|
||||
@app.before_request
|
||||
def log_request_info():
|
||||
|
Reference in New Issue
Block a user