1 points par freedomzero 2026-03-26 | Aucun commentaire pour le moment. | Partager sur WhatsApp

Bonjour, je vous présente LogXide pour celles et ceux qui rencontrent des goulots d’étranglement de journalisation et d’E/S fichier dans des environnements à forte charge comme les applications web Python et les pipelines de données.

1. Pourquoi l’avoir créé (The Problem)

Le module logging standard de Python est écrit en Python pur. Il suffit dans un environnement classique, mais dans des phases de fort trafic ou dans de grands pipelines de journalisation, il monopolise le GIL (Global Interpreter Lock) pendant les opérations d’E/S, ce qui dégrade les performances de l’ensemble de l’application.

2. Comment cela a été résolu (Architecture)

LogXide écrit la logique cœur et les handlers en Rust, avec un binding via PyO3.

  • Python-side Level Check : en plaçant FastLoggerWrapper, si le niveau de log est désactivé (par ex. appel DEBUG avec un niveau INFO configuré), l’appel est ignoré immédiatement côté Python, sans création de PyObject ni passage de la frontière PyO3. Cette optimisation améliore les performances de 2 à 5 fois sur les appels à vide.
  • E/S non bloquantes : StreamHandler, HTTPHandler et OTLPHandler traitent les logs de façon asynchrone à l’aide de canaux crossbeam et de threads d’arrière-plan. Le thread principal de l’application n’est pas bloqué.
  • write direct synchrone : dans le cas de FileHandler, les E/S OS sont effectuées directement avec Mutex<BufWriter>, avec un flush uniquement lorsque nécessaire, ce qui réduit drastiquement la surcharge d’E/S.

3. Principaux benchmarks (macOS ARM64, Python 3.12)

  • FileHandler : 2.09M msgs/sec (contre 167K pour la stdlib, soit 12,5 fois plus rapide)
  • StreamHandler : 2.14M msgs/sec (contre 11K pour la stdlib, soit 186 fois plus rapide)
  • Sur les E/S réelles de formatage de fichiers, il est 25 % plus rapide que Picologging écrit en C, et 2,4 fois plus rapide que Structlog en Python pur.

4. Fonctionnalités intégrées et utilisation

La structure permet de conserver le code existant basé sur logging.getLogger() en ne changeant qu’une seule ligne : from logxide import logging. Conformément aux tendances récentes de l’architecture backend, les handlers suivants sont intégrés nativement au niveau Rust :

  • OTLPHandler : envoi direct basé sur Protobuf sans agent OpenTelemetry
  • HTTPHandler : prise en charge de l’envoi groupé par lots (Batch)
  • SentryHandler : prise en charge intégrée de la journalisation des erreurs (pip install logxide[sentry])
  • ColorFormatter : prise en charge de l’affichage couleur dans le terminal à l’aide de séquences de contrôle ANSI

5. Limites claires (Trade-offs)

Si vous envisagez de l’adopter, il faut savoir que ce n’est pas un remplacement 100 % drop-in :

  • Il n’est pas possible d’enregistrer un logging.Handler personnalisé écrit en Python par héritage. (Pour conserver les meilleures performances, il faut utiliser uniquement les handlers intégrés implémentés en Rust.)
  • Il n’est pas possible de sous-classer les objets Logger ou LogRecord.
  • Dans un environnement pytest, il faut utiliser le fixture caplog_logxide fourni par LogXide à la place du caplog intégré.

Si vous cherchiez un excellent alternative en raison de goulots d’étranglement de performance, que ce soit face aux loggers en C ou aux bibliothèques de journalisation structurée, cela peut être une très bonne option. La documentation officielle inclut aussi des guides d’intégration directement applicables à Django, FastAPI et Flask, donc n’hésitez pas à y jeter un œil et à partager vos retours.

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.