1 Punkte von freedomzero 2026-03-26 | Noch keine Kommentare. | Auf WhatsApp teilen

Hallo, ich möchte euch LogXide vorstellen – für alle, die in hoch ausgelasteten Umgebungen wie Python-Webanwendungen und Datenpipelines mit Engpässen bei Datei-I/O und Logging zu kämpfen haben.

1. Warum es entwickelt wurde (The Problem)

Das Standardmodul logging von Python ist in reinem Python geschrieben. In normalen Umgebungen ist das ausreichend, aber bei Traffic-Spitzen oder großen Logging-Pipelines belegt es während I/O-Operationen den GIL (Global Interpreter Lock) und kann dadurch die Gesamtleistung der Anwendung verschlechtern.

2. Wie das Problem gelöst wurde (Architecture)

LogXide implementiert die Kernlogik und die Handler in Rust und bindet sie über PyO3 an.

  • Python-side Level Check: Mit FastLoggerWrapper werden Aufrufe sofort auf Python-Seite verworfen, wenn das Log-Level deaktiviert ist (z. B. ein DEBUG-Aufruf bei gesetztem INFO-Level) – ohne PyObject-Erzeugung oder das Überschreiten der PyO3-Grenze. Diese Optimierung beschleunigt leere Aufrufe um das 2- bis 5-Fache.
  • Nicht blockierendes I/O: StreamHandler, HTTPHandler und OTLPHandler verarbeiten Logs asynchron über crossbeam-Kanäle und Hintergrund-Threads. Der Haupt-Thread der Anwendung wird nicht blockiert.
  • Synchrones direktes Write: Im Fall von FileHandler wird mit Mutex<BufWriter> direktes OS-I/O ausgeführt; flush erfolgt nur bei Bedarf, wodurch der I/O-Overhead drastisch reduziert wird.

3. Wichtige Benchmarks (macOS ARM64, Python 3.12)

  • FileHandler: 2,09 Mio. msgs/sec (gegenüber 167K bei stdlib 12,5-mal schneller)
  • StreamHandler: 2,14 Mio. msgs/sec (gegenüber 11K bei stdlib 186-mal schneller)
  • Bei tatsächlichem Datei-Formatting-I/O ist es 25 % schneller als das in C geschriebene Picologging und 2,4-mal schneller als das reine Python-Framework Structlog.

4. Integrierte Funktionen und Nutzung

Die Struktur ist so ausgelegt, dass ihr mit nur einer Änderung auf from logxide import logging euren bestehenden logging.getLogger()-Code weiterverwenden könnt. Passend zu aktuellen Trends in der Backend-Architektur sind folgende Handler direkt auf Rust-Native-Niveau integriert:

  • OTLPHandler: Protobuf-basierter Direktversand ohne OpenTelemetry-Agent
  • HTTPHandler: Unterstützung für gebündeltes Senden per Batch
  • SentryHandler: Integrierte Unterstützung für Error Logging (pip install logxide[sentry])
  • ColorFormatter: Unterstützung für farbige Terminalausgabe mit ANSI-Steuerzeichen

5. Klare Einschränkungen (Trade-offs)

Wenn ihr eine Einführung prüft, solltet ihr wissen, dass es kein 100%iges Drop-in-Replacement ist:

  • Benutzerdefinierte logging.Handler, die in Python geschrieben sind, können nicht per Vererbung registriert werden. (Für maximale Performance sollten nur die integrierten, in Rust implementierten Handler verwendet werden.)
  • Logger- oder LogRecord-Objekte können nicht per Subclassing erweitert werden.
  • In pytest-Umgebungen muss statt des eingebauten caplog das von LogXide bereitgestellte Fixture caplog_logxide verwendet werden.

Wenn ihr wegen Performance-Engpässen nach einem C-basierten Logger oder einer strukturierten Logging-Bibliothek gesucht habt, kann das eine hervorragende Alternative sein. In der offiziellen Dokumentation gibt es außerdem Integrationsleitfäden, die sich direkt für Django, FastAPI und Flask anwenden lassen. Schaut es euch gern an – Feedback ist sehr willkommen.

Noch keine Kommentare.

Noch keine Kommentare.