Make logging configurable via LOG_LEVEL and smaller rotating files.
Adds env overrides for log size and backup count, and documents them for operators. Drops noisy uvicorn/httpx/qdrant lines to WARNING so logs stay readable. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
cb1d1ada8e
commit
fa653be031
|
|
@ -2,21 +2,40 @@ import logging
|
||||||
import os
|
import os
|
||||||
from logging.handlers import RotatingFileHandler
|
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):
|
def setup_logging(log_level: int = None):
|
||||||
"""
|
"""
|
||||||
Konfiguriert das Logging-System mit File- und Console-Handler.
|
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.
|
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:
|
Args:
|
||||||
log_level: Optionales Log-Level (logging.DEBUG, logging.INFO, etc.)
|
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:
|
if log_level is None:
|
||||||
# WP-24c v4.4.0-DEBUG: Unterstützung für DEBUG-Level via Umgebungsvariable
|
env_level = (os.getenv("LOG_LEVEL") or "").strip().lower()
|
||||||
debug_mode = os.getenv("DEBUG", "false").lower() == "true"
|
if env_level and env_level in _LOG_LEVEL_MAP:
|
||||||
log_level = logging.DEBUG if debug_mode else logging.INFO
|
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)
|
# 2. Log-Verzeichnis erstellen (falls nicht vorhanden)
|
||||||
log_dir = "logs"
|
log_dir = "logs"
|
||||||
if not os.path.exists(log_dir):
|
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'
|
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(
|
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.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
|
# 5. Stream Handler: Schreibt weiterhin auf die Konsole
|
||||||
console_handler = logging.StreamHandler()
|
console_handler = logging.StreamHandler()
|
||||||
console_handler.setFormatter(formatter)
|
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
|
# 6. Root Logger konfigurieren
|
||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=log_level,
|
level=log_level,
|
||||||
handlers=[file_handler, console_handler],
|
handlers=[file_handler, console_handler],
|
||||||
force=True # Überschreibt bestehende Konfiguration
|
force=True
|
||||||
)
|
)
|
||||||
|
|
||||||
level_name = "DEBUG" if log_level == logging.DEBUG else "INFO"
|
# 7. Laute Bibliotheken drosseln (weniger Zeilen bei uvicorn/httpx/qdrant)
|
||||||
logging.info(f"📝 Logging initialized (Level: {level_name}). Writing to {log_file}")
|
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}")
|
||||||
|
|
@ -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_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_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` |
|
| `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`. |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,20 @@ Administratoren sollten regelmäßig das Log für unbekannte Kanten-Typen prüfe
|
||||||
* **Pfad:** `data/logs/unknown_edges.jsonl`.
|
* **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.
|
* **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
|
### 3.3 Troubleshooting Guide
|
||||||
|
|
||||||
Dieser Abschnitt hilft bei häufigen Problemen und deren Lösung.
|
Dieser Abschnitt hilft bei häufigen Problemen und deren Lösung.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user