LogXide — un framework de journalisation Python en Rust 12,5 fois plus rapide
(github.com/Indosaram)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 dePyObjectni 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,HTTPHandleretOTLPHandlertraitent les logs de façon asynchrone à l’aide de canauxcrossbeamet de threads d’arrière-plan. Le thread principal de l’application n’est pas bloqué. writedirect synchrone : dans le cas deFileHandler, les E/S OS sont effectuées directement avecMutex<BufWriter>, avec unflushuniquement 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 queStructlogen 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.Handlerpersonnalisé é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
LoggerouLogRecord. - Dans un environnement pytest, il faut utiliser le fixture
caplog_logxidefourni par LogXide à la place ducaploginté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.
- Documentation officielle : https://indosaram.github.io/logxide/
Aucun commentaire pour le moment.