diff --git a/app/core/logging_setup.py b/app/core/logging_setup.py index c6f23b2..3b962c7 100644 --- a/app/core/logging_setup.py +++ b/app/core/logging_setup.py @@ -2,21 +2,40 @@ import logging import os from logging.handlers import RotatingFileHandler +# Umgebungsvariablen für Log-Begrenzung (weniger Zeilen, bessere Auswertbarkeit) +# LOG_LEVEL: INFO | WARNING | ERROR | DEBUG (Default: INFO, oder DEBUG wenn DEBUG=true) +# LOG_MAX_BYTES: Max. Größe einer Log-Datei in Bytes (Default: 1MB) +# LOG_BACKUP_COUNT: Anzahl rotierter Backups (Default: 2) +_LOG_LEVEL_MAP = { + "debug": logging.DEBUG, + "info": logging.INFO, + "warning": logging.WARNING, + "error": logging.ERROR, +} + +# Laute Bibliotheken: nur WARNING+ in Datei/Konsole, reduziert Zeilen deutlich +_NOISY_LOGGERS = ("uvicorn", "uvicorn.access", "httpx", "httpcore", "qdrant_client") + + def setup_logging(log_level: int = None): """ Konfiguriert das Logging-System mit File- und Console-Handler. WP-24c v4.4.0-DEBUG: Unterstützt DEBUG-Level für End-to-End Tracing. - + Log-Auswertbarkeit: Rotation und LOG_LEVEL begrenzen Dateigröße/Zeilen. + Args: log_level: Optionales Log-Level (logging.DEBUG, logging.INFO, etc.) - Falls nicht gesetzt, wird aus DEBUG Umgebungsvariable gelesen. + Falls nicht gesetzt: LOG_LEVEL env, sonst DEBUG env, sonst INFO. """ - # 1. Log-Level bestimmen + # 1. Log-Level bestimmen (LOG_LEVEL hat Vorrang vor DEBUG) if log_level is None: - # WP-24c v4.4.0-DEBUG: Unterstützung für DEBUG-Level via Umgebungsvariable - debug_mode = os.getenv("DEBUG", "false").lower() == "true" - log_level = logging.DEBUG if debug_mode else logging.INFO - + env_level = (os.getenv("LOG_LEVEL") or "").strip().lower() + if env_level and env_level in _LOG_LEVEL_MAP: + log_level = _LOG_LEVEL_MAP[env_level] + else: + debug_mode = os.getenv("DEBUG", "false").lower() == "true" + log_level = logging.DEBUG if debug_mode else logging.INFO + # 2. Log-Verzeichnis erstellen (falls nicht vorhanden) log_dir = "logs" if not os.path.exists(log_dir): @@ -30,24 +49,31 @@ def setup_logging(log_level: int = None): datefmt='%Y-%m-%d %H:%M:%S' ) - # 4. File Handler: Schreibt in Datei (max. 5MB pro Datei, behält 5 Backups) + # 4. Rotation: kleinere Dateien = weniger Zeilen pro Datei, bessere Auswertbarkeit + max_bytes = int(os.getenv("LOG_MAX_BYTES", str(1 * 1024 * 1024))) # Default 1 MB + backup_count = int(os.getenv("LOG_BACKUP_COUNT", "2")) + file_handler = RotatingFileHandler( - log_file, maxBytes=5*1024*1024, backupCount=5, encoding='utf-8' + log_file, maxBytes=max_bytes, backupCount=backup_count, encoding='utf-8' ) file_handler.setFormatter(formatter) - file_handler.setLevel(log_level) # WP-24c v4.4.0-DEBUG: Respektiert log_level + file_handler.setLevel(log_level) # 5. Stream Handler: Schreibt weiterhin auf die Konsole console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) - console_handler.setLevel(log_level) # WP-24c v4.4.0-DEBUG: Respektiert log_level + console_handler.setLevel(log_level) # 6. Root Logger konfigurieren logging.basicConfig( level=log_level, handlers=[file_handler, console_handler], - force=True # Überschreibt bestehende Konfiguration + force=True ) - level_name = "DEBUG" if log_level == logging.DEBUG else "INFO" - logging.info(f"📝 Logging initialized (Level: {level_name}). Writing to {log_file}") \ No newline at end of file + # 7. Laute Bibliotheken drosseln (weniger Zeilen bei uvicorn/httpx/qdrant) + for name in _NOISY_LOGGERS: + logging.getLogger(name).setLevel(logging.WARNING) + + level_name = logging.getLevelName(log_level) + logging.info(f"📝 Logging initialized (Level: {level_name}). File: {log_file}, maxBytes={max_bytes}, backups={backup_count}") \ No newline at end of file diff --git a/docs/03_Technical_References/03_tech_configuration.md b/docs/03_Technical_References/03_tech_configuration.md index e8998da..8d13e71 100644 --- a/docs/03_Technical_References/03_tech_configuration.md +++ b/docs/03_Technical_References/03_tech_configuration.md @@ -55,6 +55,9 @@ Diese Variablen steuern die Infrastruktur, Pfade und globale Timeouts. Seit der | `MINDNET_NOTE_SCOPE_ZONE_HEADERS` | `Smart Edges,Relationen,Global Links,Note-Level Relations,Globale Verbindungen` | **Neu (v4.2.0, WP-24c):** Komma-separierte Header-Namen für Note-Scope Zonen. Links in diesen Zonen werden als `scope: note` behandelt und nutzen Note-Summary/Text in Phase 3 Validierung. | | `MINDNET_NOTE_SCOPE_HEADER_LEVEL` | `2` | **Neu (v4.2.0, WP-24c):** Header-Ebene für Note-Scope Zonen (1-6, Default: 2 für ##). Bestimmt, welche Überschriften als Note-Scope Zonen erkannt werden. | | `MINDNET_IGNORE_FOLDERS` | *(leer)* | **Neu (v4.1.0):** Komma-separierte Liste von Ordnernamen, die beim Import ignoriert werden. Beispiel: `.trash,.obsidian,.git,.sync` | +| `LOG_LEVEL` | *(siehe Text)* | **Logging:** `INFO`, `WARNING`, `ERROR` oder `DEBUG`. Default: `INFO` (bzw. `DEBUG` wenn `DEBUG=true`). Reduziert Log-Zeilen bei `INFO`/`WARNING`. | +| `LOG_MAX_BYTES` | `1048576` (1 MB) | **Logging:** Max. Größe einer Log-Datei in Bytes vor Rotation. Kleinere Werte = kürzere Einzeldateien. | +| `LOG_BACKUP_COUNT` | `2` | **Logging:** Anzahl rotierter Backup-Dateien für `logs/mindnet.log`. | --- diff --git a/docs/04_Operations/04_admin_operations.md b/docs/04_Operations/04_admin_operations.md index f9191ce..aa0b123 100644 --- a/docs/04_Operations/04_admin_operations.md +++ b/docs/04_Operations/04_admin_operations.md @@ -137,6 +137,20 @@ Administratoren sollten regelmäßig das Log für unbekannte Kanten-Typen prüfe * **Pfad:** `data/logs/unknown_edges.jsonl`. * **Aktion:** Wenn neue Typen häufig auftreten, sollten diese als Alias in die `01_edge_vocabulary.md` aufgenommen werden. +### 3.2.1 Logging begrenzen (Dateigröße / Zeilen) +Das Hauptlog liegt unter `logs/mindnet.log`. Bei sehr langen Logs (z. B. >80.000 Zeilen) kannst du die Ausgabe eingrenzen: + +| Umgebungsvariable | Bedeutung | Default | +|-------------------|-----------|---------| +| **`LOG_LEVEL`** | `INFO`, `WARNING`, `ERROR` oder `DEBUG` | `INFO` (bzw. `DEBUG` wenn `DEBUG=true`) | +| **`LOG_MAX_BYTES`** | Max. Größe einer Log-Datei in Bytes vor Rotation | `1048576` (1 MB) | +| **`LOG_BACKUP_COUNT`** | Anzahl rotierter Backup-Dateien | `2` | + +**Empfehlung bei zu langen Logs:** +* **`LOG_LEVEL=INFO`** (oder **`WARNING`**) in `.env` setzen – reduziert die Zeilen deutlich gegenüber `DEBUG`. +* Uvicorn-, HTTP- und Qdrant-Logs werden intern auf WARNING gedrosselt, sodass weniger Framework-Zeilen anfallen. +* Kleinere **`LOG_MAX_BYTES`** (z. B. `524288` = 512 KB) führt zu häufigerer Rotation und kürzeren Einzeldateien. + ### 3.3 Troubleshooting Guide Dieser Abschnitt hilft bei häufigen Problemen und deren Lösung.