🐛 Backend Optimization: Removed error monitoring configuration files and utilities, refactored logging configuration for improved performance. 🎉

This commit is contained in:
2025-05-30 20:37:02 +02:00
parent 5543e9ba5e
commit d1a6281577
4 changed files with 56 additions and 838 deletions

View File

@@ -222,13 +222,6 @@ def format_datetime_filter(value, format='%d.%m.%Y %H:%M'):
setup_logging()
log_startup_info()
# Error-Monitoring-System starten
try:
from utils.logging_config import setup_error_monitoring
setup_error_monitoring()
except Exception as e:
print(f"⚠️ Error-Monitoring konnte nicht gestartet werden: {str(e)}")
# Logger für verschiedene Komponenten
app_logger = get_logger("app")
auth_logger = get_logger("auth")
@@ -331,23 +324,23 @@ def login():
remember_me = False
try:
if is_json_request:
if is_json_request:
# JSON-Request verarbeiten
try:
data = request.get_json(force=True) or {}
username = data.get("username") or data.get("email")
password = data.get("password")
remember_me = data.get("remember_me", False)
password = data.get("password")
remember_me = data.get("remember_me", False)
except Exception as json_error:
auth_logger.warning(f"JSON-Parsing fehlgeschlagen: {str(json_error)}")
# Fallback zu Form-Daten
username = request.form.get("email")
password = request.form.get("password")
remember_me = request.form.get("remember_me") == "on"
else:
else:
# Form-Request verarbeiten
username = request.form.get("email")
password = request.form.get("password")
password = request.form.get("password")
remember_me = request.form.get("remember_me") == "on"
# Zusätzlicher Fallback für verschiedene Feldnamen
@@ -2306,16 +2299,16 @@ def finish_job(job_id):
def cancel_job(job_id):
"""Bricht einen Job ab."""
try:
db_session = get_db_session()
db_session = get_db_session()
job = db_session.query(Job).get(job_id)
if not job:
db_session.close()
db_session.close()
return jsonify({"error": "Job nicht gefunden"}), 404
# Prüfen, ob der Job abgebrochen werden kann
if job.status not in ["scheduled", "running"]:
db_session.close()
db_session.close()
return jsonify({"error": f"Job kann im Status '{job.status}' nicht abgebrochen werden"}), 400
# Job als abgebrochen markieren
@@ -2327,7 +2320,7 @@ def cancel_job(job_id):
from utils.job_scheduler import toggle_plug
toggle_plug(job.printer_id, False)
db_session.commit()
db_session.commit()
job_dict = job.to_dict()
db_session.close()
@@ -2345,16 +2338,16 @@ def cancel_job(job_id):
def start_job(job_id):
"""Startet einen Job manuell."""
try:
db_session = get_db_session()
db_session = get_db_session()
job = db_session.query(Job).options(joinedload(Job.printer)).get(job_id)
if not job:
db_session.close()
return jsonify({"error": "Job nicht gefunden"}), 404
# Prüfen, ob der Job gestartet werden kann
if job.status not in ["scheduled", "queued", "waiting_for_printer"]:
db_session.close()
db_session.close()
return jsonify({"error": f"Job kann im Status '{job.status}' nicht gestartet werden"}), 400
# Drucker einschalten falls verfügbar
@@ -2365,7 +2358,7 @@ def start_job(job_id):
jobs_logger.info(f"Drucker {job.printer.name} für Job {job_id} eingeschaltet")
else:
jobs_logger.warning(f"Konnte Drucker {job.printer.name} für Job {job_id} nicht einschalten")
except Exception as e:
except Exception as e:
jobs_logger.warning(f"Fehler beim Einschalten des Druckers für Job {job_id}: {str(e)}")
# Job als laufend markieren
@@ -2405,7 +2398,7 @@ def pause_job(job_id):
# Prüfen, ob der Job pausiert werden kann
if job.status != "running":
db_session.close()
db_session.close()
return jsonify({"error": f"Job kann im Status '{job.status}' nicht pausiert werden"}), 400
# Drucker ausschalten
@@ -2416,7 +2409,7 @@ def pause_job(job_id):
jobs_logger.info(f"Drucker {job.printer.name} für Job {job_id} ausgeschaltet (Pause)")
else:
jobs_logger.warning(f"Konnte Drucker {job.printer.name} für Job {job_id} nicht ausschalten")
except Exception as e:
except Exception as e:
jobs_logger.warning(f"Fehler beim Ausschalten des Druckers für Job {job_id}: {str(e)}")
# Job als pausiert markieren
@@ -2426,7 +2419,7 @@ def pause_job(job_id):
db_session.commit()
job_dict = job.to_dict()
db_session.close()
db_session.close()
jobs_logger.info(f"Job {job_id} pausiert von Benutzer {current_user.id}")
return jsonify({
@@ -2465,7 +2458,7 @@ def resume_job(job_id):
jobs_logger.info(f"Drucker {job.printer.name} für Job {job_id} eingeschaltet (Resume)")
else:
jobs_logger.warning(f"Konnte Drucker {job.printer.name} für Job {job_id} nicht einschalten")
except Exception as e:
except Exception as e:
jobs_logger.warning(f"Fehler beim Einschalten des Druckers für Job {job_id}: {str(e)}")
# Job als laufend markieren
@@ -4526,7 +4519,7 @@ if __name__ == "__main__":
os.environ['FLASK_ENV'] = 'development'
os.environ['PYTHONIOENCODING'] = 'utf-8'
os.environ['PYTHONUTF8'] = '1'
# Windows-spezifisches Signal-Handling für ordnungsgemäßes Shutdown
def signal_handler(sig, frame):
"""Signal-Handler für ordnungsgemäßes Shutdown."""
@@ -4534,7 +4527,7 @@ if __name__ == "__main__":
try:
# Queue Manager stoppen
app_logger.info("🔄 Beende Queue Manager...")
stop_queue_manager()
stop_queue_manager()
# Scheduler stoppen falls aktiviert
if SCHEDULER_ENABLED and scheduler:
@@ -4590,15 +4583,15 @@ if __name__ == "__main__":
# Signal-Handler registrieren (Windows-kompatibel)
if os.name == 'nt': # Windows
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
if os.name == 'nt': # Windows
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
# Zusätzlich für Flask-Development-Server
signal.signal(signal.SIGBREAK, signal_handler)
else: # Unix/Linux
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGHUP, signal_handler)
signal.signal(signal.SIGBREAK, signal_handler)
else: # Unix/Linux
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGHUP, signal_handler)
try:
# Datenbank initialisieren
@@ -4606,24 +4599,24 @@ if __name__ == "__main__":
create_initial_admin()
# Template-Hilfsfunktionen registrieren
register_template_helpers(app)
register_template_helpers(app)
# Drucker-Monitor Steckdosen-Initialisierung beim Start
try:
app_logger.info("🖨️ Starte automatische Steckdosen-Initialisierung...")
initialization_results = printer_monitor.initialize_all_outlets_on_startup()
if initialization_results:
success_count = sum(1 for success in initialization_results.values() if success)
total_count = len(initialization_results)
initialization_results = printer_monitor.initialize_all_outlets_on_startup()
if initialization_results:
success_count = sum(1 for success in initialization_results.values() if success)
total_count = len(initialization_results)
app_logger.info(f"✅ Steckdosen-Initialisierung: {success_count}/{total_count} Drucker erfolgreich")
if success_count < total_count:
app_logger.warning(f"⚠️ {total_count - success_count} Drucker konnten nicht initialisiert werden")
else:
if success_count < total_count:
app_logger.warning(f"⚠️ {total_count - success_count} Drucker konnten nicht initialisiert werden")
else:
app_logger.info(" Keine Drucker zur Initialisierung gefunden")
except Exception as e:
except Exception as e:
app_logger.error(f"❌ Fehler bei automatischer Steckdosen-Initialisierung: {str(e)}")
# Queue-Manager für automatische Drucker-Überwachung starten
@@ -4666,15 +4659,15 @@ if __name__ == "__main__":
# Connection-Pool ordnungsgemäß schließen
engine.dispose()
app_logger.info("✅ Finales Datenbank-Cleanup abgeschlossen")
except Exception as e:
except Exception as e:
app_logger.error(f"❌ Fehler beim finalen Datenbank-Cleanup: {str(e)}")
atexit.register(cleanup_database)
except Exception as e:
app_logger.error(f"❌ Fehler beim Starten des Queue-Managers: {str(e)}")
else:
else:
app_logger.info("🔄 Debug-Modus: Queue Manager deaktiviert für Entwicklung")
# Scheduler starten (falls aktiviert)
@@ -4682,7 +4675,7 @@ if __name__ == "__main__":
try:
scheduler.start()
app_logger.info("Job-Scheduler gestartet")
except Exception as e:
except Exception as e:
app_logger.error(f"Fehler beim Starten des Schedulers: {str(e)}")
if debug_mode:
@@ -4703,28 +4696,28 @@ if __name__ == "__main__":
run_kwargs["passthrough_errors"] = False
app_logger.info("Windows-Debug-Modus: Auto-Reload deaktiviert")
app.run(**run_kwargs)
app.run(**run_kwargs)
else:
# Produktions-Modus: HTTPS auf Port 443
ssl_context = get_ssl_context()
if ssl_context:
app_logger.info("Starte HTTPS-Server auf 0.0.0.0:443")
app.run(
app.run(
host="0.0.0.0",
port=443,
debug=False,
ssl_context=ssl_context,
threaded=True
)
port=443,
debug=False,
ssl_context=ssl_context,
threaded=True
)
else:
app_logger.info("Starte HTTP-Server auf 0.0.0.0:8080")
app.run(
app.run(
host="0.0.0.0",
port=8080,
debug=False,
threaded=True
)
port=8080,
debug=False,
threaded=True
)
except KeyboardInterrupt:
app_logger.info("🔄 Tastatur-Unterbrechung empfangen - beende Anwendung...")
signal_handler(signal.SIGINT, None)
@@ -4866,54 +4859,4 @@ def get_printers():
return jsonify({
"error": f"Fehler beim Laden der Drucker: {str(e)}",
"printers": []
}), 500
@app.route('/api/admin/error-monitor/stats', methods=['GET'])
@admin_required
def get_error_monitor_stats():
"""Gibt Statistiken des Error-Monitoring-Systems zurück."""
try:
from utils.error_monitor import get_error_monitor
monitor = get_error_monitor()
stats = monitor.get_stats()
return jsonify({
"success": True,
"stats": stats
})
except Exception as e:
app_logger.error(f"Fehler beim Abrufen der Error-Monitor-Statistiken: {str(e)}")
return jsonify({
"success": False,
"error": str(e)
}), 500
@app.route('/api/admin/error-monitor/force-report', methods=['POST'])
@admin_required
def force_error_report():
"""Erzwingt das sofortige Senden eines Error-Reports (für Tests)."""
try:
from utils.error_monitor import get_error_monitor
monitor = get_error_monitor()
success = monitor.force_report()
if success:
return jsonify({
"success": True,
"message": "Error Report erfolgreich versendet"
})
else:
return jsonify({
"success": False,
"error": "Report konnte nicht versendet werden"
}), 500
except Exception as e:
app_logger.error(f"Fehler beim Erzwingen des Error-Reports: {str(e)}")
return jsonify({
"success": False,
"error": str(e)
}), 500