diff --git a/admin_api.py b/admin_api.py index a1e9f14..e016cdb 100644 --- a/admin_api.py +++ b/admin_api.py @@ -365,33 +365,37 @@ def debug_management(): # ===== view-logs ===== if action == 'view-logs': + log_file = current_app.config.get('LOG_FILE', '/app/logs/spawner.log') try: - import subprocess - # Lese Docker Container Logs - result = subprocess.run( - ['docker', 'logs', '--tail', '100', 'spawner'], - capture_output=True, - text=True, - timeout=10 - ) - logs = result.stdout if result.returncode == 0 else result.stderr - + with open(log_file, 'r', encoding='utf-8') as f: + lines = f.readlines() + last_100 = lines[-100:] if len(lines) > 100 else lines return jsonify({ 'action': 'view-logs', - 'source': 'docker logs spawner', - 'lines': len(logs.split('\n')), - 'logs': logs + 'source': 'Flask Log File', + 'total_lines': len(lines), + 'displayed_lines': len(last_100), + 'logs': ''.join(last_100) }), 200 + except FileNotFoundError: + return jsonify({'error': f'Log-Datei nicht gefunden: {log_file}'}), 404 except Exception as e: return jsonify({'error': f'Fehler beim Lesen der Logs: {str(e)}'}), 500 # ===== clear-logs ===== elif action == 'clear-logs': - return jsonify({ - 'action': 'clear-logs', - 'message': 'Docker-Logs können nicht gelöscht werden', - 'info': 'Nutze stattdessen: docker-compose logs -f spawner --tail 1' - }), 200 + log_file = current_app.config.get('LOG_FILE', '/app/logs/spawner.log') + try: + with open(log_file, 'w') as f: + f.write('') + current_app.logger.info('[DEBUG] Logs wurden gelöscht') + return jsonify({ + 'action': 'clear-logs', + 'message': 'Log-Datei wurde geleert', + 'log_file': log_file + }), 200 + except Exception as e: + return jsonify({'error': f'Fehler beim Löschen der Logs: {str(e)}'}), 500 # ===== delete-email ===== elif action == 'delete-email': diff --git a/app.py b/app.py index fe28ea9..8896349 100644 --- a/app.py +++ b/app.py @@ -9,6 +9,9 @@ from api import api_bp, check_if_token_revoked from admin_api import admin_bp from config import Config from container_manager import ContainerManager +import logging +from logging.handlers import RotatingFileHandler +import os # Flask-App initialisieren app = Flask(__name__) @@ -46,6 +49,29 @@ def invalid_token_callback(error): def missing_token_callback(error): return jsonify({'error': 'Authentifizierung erforderlich'}), 401 +# ======================================== +# Logging konfigurieren +# ======================================== +log_file = app.config.get('LOG_FILE', '/app/logs/spawner.log') +log_dir = os.path.dirname(log_file) + +# Erstelle Log-Verzeichnis falls nicht vorhanden +if log_dir and not os.path.exists(log_dir): + os.makedirs(log_dir, exist_ok=True) + +# Rotating File Handler (max 10MB pro Datei, 5 Backups) +if log_file: + file_handler = RotatingFileHandler( + log_file, + maxBytes=10485760, # 10MB + backupCount=5 + ) + file_handler.setLevel(logging.INFO) + formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') + file_handler.setFormatter(formatter) + app.logger.addHandler(file_handler) + app.logger.setLevel(logging.INFO) + # Flask-Login initialisieren login_manager = LoginManager() login_manager.init_app(app) diff --git a/docs/install/DEPLOYMENT_GUIDE.md b/docs/install/DEPLOYMENT_GUIDE.md index efeebe3..73d86b6 100644 --- a/docs/install/DEPLOYMENT_GUIDE.md +++ b/docs/install/DEPLOYMENT_GUIDE.md @@ -592,7 +592,7 @@ curl -H "X-Debug-Token: xxx" \ "http://localhost:5000/api/admin/debug?action=view-logs" ``` -Zeigt die **letzten 100 Zeilen** der Docker Container Logs (entspricht `docker logs spawner --tail 100`). +Zeigt die **letzten 100 Zeilen** der Flask Log-Datei (`/app/logs/spawner.log`). Enthält alle API-Anfragen, Fehler und Debug-Meldungen. #### 2. Logs löschen (clear-logs) @@ -601,14 +601,13 @@ curl -H "X-Debug-Token: xxx" \ "http://localhost:5000/api/admin/debug?action=clear-logs" ``` -**Docker-Logs können nicht gelöscht werden!** Diese Action ist informativ. Um Logs zu löschen, nutze stattdessen: +Löscht die Log-Datei komplett. Um Logs zu löschen, nutze auch direkt im Container: ```bash -docker-compose down -docker-compose up -d spawner +docker exec spawner rm /app/logs/spawner.log ``` -Das startet den Container neu und die Logs werden geleert. +Nach dem Löschen werden neue Logs ab der nächsten Aktion geschrieben. #### 3. User entfernen (delete-email)