15 KiB
🔍 AUDIT COMPLET DU SYSTÈME DE LOGS VEZA
Date: 2025-01-27
Auditeur: Expert Observabilité
Version: 1.0
📋 RÉSUMÉ EXÉCUTIF
Le système de logs Veza présente plusieurs problèmes critiques qui impactent l'observabilité et le debugging :
- Problèmes critiques : 5
- Problèmes majeurs : 8
- Problèmes mineurs : 12
- Recommandations : 15
Impact global : 🔴 ÉLEVÉ - Les logs ne sont pas fiables, la corrélation entre services est absente, et le debugging en production est difficile.
1. AUDIT BACKEND GO (veza-backend-api)
1.1 Configuration du Logger
✅ Points Positifs
- Utilisation de zap (logger structuré performant)
- Support de l'agrégation de logs (Loki) via
logger_aggregation.go - Configuration basée sur l'environnement (dev/prod)
- Support des niveaux de log via
LOG_LEVEL
❌ Problèmes Identifiés
PROBLÈME #1 : Double Initialisation du Logger
- Fichier :
cmd/api/main.go:53etinternal/config/config.go:205 - Description : Le logger est initialisé deux fois :
- Dans
main.goaveczap.NewProduction()(ligne 53) - Dans
config.NewConfig()aveczap.NewProduction()(ligne 205)
- Dans
- Impact : Le logger de
main.goest ignoré, gaspillage de ressources - Solution : Supprimer l'initialisation dans
main.go, utiliser uniquement celui deconfig.NewConfig()
PROBLÈME #2 : Logger Non Configuré selon LOG_LEVEL
- Fichier :
internal/config/config.go:205 - Description : Le logger est créé avec
zap.NewProduction()AVANT de lireLOG_LEVEL - Code problématique :
logger, err := zap.NewProduction() // Ligne 205 - ignore LOG_LEVEL // ... logLevel := getEnv("LOG_LEVEL", "INFO") // Ligne 221 - lu après - Impact : Le niveau de log est toujours
INFOmême siLOG_LEVEL=DEBUGest défini - Solution : Lire
LOG_LEVELAVANT d'initialiser le logger, ou utiliserNewLoggerWithAggregationqui respecte le niveau
PROBLÈME #3 : Logger Temporaire Non Utilisé Correctement
- Fichier :
internal/config/config.go:205-340 - Description : Un logger temporaire est créé, puis potentiellement remplacé par un logger avec agrégation, mais les logs initiaux utilisent le mauvais logger
- Impact : Les logs de démarrage peuvent ne pas être envoyés à l'agrégation
- Solution : Initialiser directement le bon logger selon la configuration
PROBLÈME #4 : Sync() Non Garanti au Shutdown
- Fichier :
cmd/api/main.go:57,internal/config/config.go:1120 - Description :
defer logger.Sync()peut échouer silencieusement, et le flush final n'est pas garanti - Impact : Perte de logs lors du shutdown
- Solution : Utiliser le
ShutdownManagerexistant pour garantir le flush
1.2 Logs Non Structurés (fmt.Println)
❌ Problèmes Identifiés
PROBLÈME #5 : Utilisation de fmt.Println dans le Code
- Fichiers affectés : 12 fichiers avec
fmt.Print* - Exemples :
internal/core/auth/service.go:233:fmt.Printf(">>> ERROR STRING: %s\n", result.Error.Error())internal/handlers/auth.go:150-167: Multipleslogger.Info("=== DEBUG ===")avec messages de debug
- Impact :
- Logs non structurés, difficiles à parser
- Logs de debug en production (sécurité)
- Pas de corrélation avec request_id
- Solution : Remplacer tous les
fmt.Print*par des logs structurés avec zap
PROBLÈME #6 : Logs de Debug Excessifs
- Fichier :
internal/handlers/auth.go:150-167 - Description : Logs de debug avec
=== REGISTER HANDLER CALLED ===qui polluent les logs - Impact : Performance et lisibilité
- Solution : Utiliser
logger.Debug()au lieu delogger.Info()pour les logs de debug
1.3 Middleware de Logging HTTP
✅ Points Positifs
- Middleware
RequestLoggerbien structuré - Support du
request_idpour la corrélation - Support de
trace_idetspan_id(T0025) - Logs structurés avec contexte complet
❌ Problèmes Identifiés
PROBLÈME #7 : Middleware Logger Dupliqué
- Fichier :
internal/middleware/logger.goetinternal/middleware/request_logger.go - Description : Deux middlewares de logging existent :
middleware.Logger()- format texte simple (Gin standard)middleware.RequestLogger()- format structuré avec zap
- Impact : Confusion, logs dupliqués si les deux sont utilisés
- Solution : Supprimer
middleware.Logger()(legacy), utiliser uniquementRequestLogger
PROBLÈME #8 : RequestLogger Non Appliqué Globalement
- Fichier :
internal/api/router.go - Description : Le
RequestLoggern'est pas visible dans la configuration des routes - Impact : Les requêtes peuvent ne pas être loggées correctement
- Solution : Vérifier et appliquer
RequestLoggerdansrouter.go
PROBLÈME #9 : Pas de Logging des Requêtes Lentes par Défaut
- Fichier :
internal/middleware/request_logger.go - Description : Les requêtes lentes ne sont pas identifiées automatiquement
- Impact : Difficulté à identifier les problèmes de performance
- Solution : Ajouter un seuil de latence configurable (ex: >1s = WARN)
1.4 Gestion des Erreurs
✅ Points Positifs
- Middleware
ErrorHandlerbien structuré - Support du contexte (request_id, user_id)
- Intégration avec Sentry
❌ Problèmes Identifiés
PROBLÈME #10 : Erreurs Silencieuses
- Fichier :
internal/core/auth/service.goet autres - Description : Certaines erreurs sont loggées mais pas toutes
- Exemple :
if err != nil { return err }sans log - Impact : Perte d'information pour le debugging
- Solution : Logger toutes les erreurs avec contexte
PROBLÈME #11 : Pas de Corrélation avec les Services Rust
- Description : Le
request_idn'est pas propagé vers les services Rust (chat-server, stream-server) - Impact : Impossible de tracer une requête à travers tous les services
- Solution : Propager le
request_idvia headers HTTP ou RabbitMQ
2. AUDIT SERVICES RUST
2.1 Chat Server (veza-chat-server)
✅ Points Positifs
- Utilisation de tracing (framework moderne)
- Support JSON en production
- Support des spans pour le tracing distribué
❌ Problèmes Identifiés
PROBLÈME #12 : Configuration de Logging Incohérente
- Fichier :
veza-chat-server/src/main.rs:84-101 - Description : La configuration du logging est faite directement dans
main.rsau lieu d'utiliserveza-common/src/logging.rs - Impact : Duplication de code, configuration incohérente
- Solution : Utiliser
veza_common::logging::init()ouinit_with_config()
PROBLÈME #13 : Pas de Corrélation avec Backend Go
- Description : Le
request_iddu backend Go n'est pas propagé au chat server - Impact : Impossible de tracer une requête complète
- Solution : Extraire
X-Request-IDdes headers WebSocket/HTTP et l'utiliser dans les spans
PROBLÈME #14 : Pas de Rotation des Logs
- Fichier :
veza-chat-server/src/structured_logging.rs - Description : Les logs sont envoyés vers stdout mais pas vers des fichiers avec rotation
- Impact : Risque de perte de logs, difficulté de debugging
- Solution : Utiliser
tracing-appenderpour la rotation
2.2 Stream Server (veza-stream-server)
✅ Points Positifs
- Utilisation de tracing
- Format JSON en production
❌ Problèmes Identifiés
PROBLÈME #15 : Configuration de Logging Dupliquée
- Fichier :
veza-stream-server/src/main.rs:18-28 - Description : Même problème que chat-server, configuration dupliquée
- Solution : Utiliser
veza-common::logging
PROBLÈME #16 : Pas de Corrélation avec Backend Go
- Même problème que chat-server
2.3 Veza Common (veza-common)
✅ Points Positifs
- Module
logging.rscentralisé avec configuration - Support JSON et texte
- Support de la rotation (configuré mais pas utilisé)
❌ Problèmes Identifiés
PROBLÈME #17 : Module Non Utilisé
- Description : Les services Rust n'utilisent pas
veza-common::logging - Impact : Code dupliqué, configuration incohérente
- Solution : Refactoriser pour utiliser le module commun
3. AUDIT FRONTEND REACT (apps/web)
3.1 Système de Logging
✅ Points Positifs
- Logger conditionnel dans
utils/logger.ts - Filtrage selon l'environnement (dev/prod)
❌ Problèmes Identifiés
PROBLÈME #18 : Utilisation Massive de console.log
- Statistique : 192 occurrences de
console.log/error/warndans 72 fichiers - Impact :
- Logs non structurés
- Pas de corrélation avec le backend
- Difficile à parser et analyser
- Solution : Migrer vers un logger structuré avec corrélation
PROBLÈME #19 : Pas de Logger Structuré
- Fichier :
apps/web/src/utils/logger.ts - Description : Le logger actuel est juste un wrapper autour de
console.* - Impact : Pas de format structuré (JSON), pas de corrélation
- Solution : Implémenter un logger structuré avec :
- Format JSON optionnel
- Corrélation avec
request_id - Envoi vers un endpoint de logging (optionnel)
PROBLÈME #20 : Pas d'Error Tracking
- Description : Pas d'intégration avec Sentry ou autre service d'error tracking
- Impact : Erreurs frontend non trackées
- Solution : Intégrer Sentry pour le frontend
PROBLÈME #21 : Logs de Debug en Production
- Fichier :
apps/web/src/utils/logger.ts:21-24 - Description : Les logs
debugetinfosont filtrés en prod, maiswarneterrorsont toujours loggés - Impact : Pollution des logs en production
- Solution : Configurer un niveau de log via variable d'environnement
PROBLÈME #22 : Pas de Corrélation avec Backend
- Description : Les logs frontend n'incluent pas le
request_iddu backend - Impact : Impossible de corréler les logs frontend/backend
- Solution : Extraire
X-Request-IDdes réponses API et l'inclure dans les logs
4. PROBLÈMES TRANSVERSAUX
4.1 Corrélation entre Services
PROBLÈME #23 : Pas de Propagation du Request ID
- Description : Le
request_idn'est pas propagé entre :- Backend Go → Chat Server (Rust)
- Backend Go → Stream Server (Rust)
- Backend → Frontend (dans les logs frontend)
- Impact : CRITIQUE - Impossible de tracer une requête complète
- Solution :
- Propager
X-Request-IDvia headers HTTP - Propager via RabbitMQ (metadata)
- Utiliser OpenTelemetry pour le tracing distribué
- Propager
4.2 Configuration des Niveaux de Log
PROBLÈME #24 : Configuration Incohérente
- Backend Go :
LOG_LEVEL(INFO, DEBUG, WARN, ERROR) - Services Rust :
RUST_LOG(info, debug, warn, error, trace) - Frontend : Pas de configuration (hardcodé)
- Impact : Difficile de configurer les niveaux globalement
- Solution : Standardiser sur
LOG_LEVELpour tous les services
4.3 Format des Logs
PROBLÈME #25 : Formats Incohérents
- Backend Go : JSON en prod, console en dev
- Services Rust : JSON en prod, texte en dev
- Frontend : Console (texte)
- Impact : Difficile d'agréger les logs
- Solution : Standardiser sur JSON pour tous les services en production
4.4 Agrégation de Logs
PROBLÈME #26 : Agrégation Non Configurée par Défaut
- Fichier :
internal/logging/logger_aggregation.go - Description : L'agrégation vers Loki existe mais est désactivée par défaut
- Impact : Logs dispersés, difficile à analyser
- Solution : Activer l'agrégation par défaut en production
5. PROBLÈMES DE PERFORMANCE
PROBLÈME #27 : Logs Synchrones
- Description : Tous les logs sont synchrones (bloquants)
- Impact : Performance dégradée sous charge
- Solution : Utiliser des buffers asynchrones pour les logs non critiques
PROBLÈME #28 : Pas de Sampling
- Description : Tous les logs sont envoyés, même les plus verbeux
- Impact : Coût élevé en stockage et bande passante
- Solution : Implémenter un sampling pour les logs DEBUG/INFO
6. PROBLÈMES DE SÉCURITÉ
PROBLÈME #29 : Logs de Debug en Production
- Fichier :
internal/handlers/auth.go:150-167 - Description : Logs de debug avec
=== DEBUG ===en production - Impact : Fuite d'information, performance
- Solution : Utiliser
logger.Debug()et désactiver en prod
PROBLÈME #30 : Secrets Potentiellement Loggés
- Description : Risque de logger des secrets (tokens, passwords) dans les erreurs
- Impact : CRITIQUE - Fuite de secrets
- Solution : Implémenter un filtre de secrets dans le logger
7. RÉSUMÉ DES PROBLÈMES PAR PRIORITÉ
🔴 CRITIQUE (P0)
- PROBLÈME #23 : Pas de propagation du Request ID entre services
- PROBLÈME #30 : Risque de logger des secrets
- PROBLÈME #2 : Logger non configuré selon LOG_LEVEL
🟠 MAJEUR (P1)
- PROBLÈME #5 : Utilisation de fmt.Println (12 fichiers)
- PROBLÈME #18 : 192 console.log dans le frontend
- PROBLÈME #12 : Configuration de logging incohérente (Rust)
- PROBLÈME #7 : Middleware logger dupliqué
- PROBLÈME #26 : Agrégation non configurée par défaut
🟡 MOYEN (P2)
- PROBLÈME #6 : Logs de debug excessifs
- PROBLÈME #10 : Erreurs silencieuses
- PROBLÈME #19 : Pas de logger structuré frontend
- PROBLÈME #24 : Configuration incohérente des niveaux
🟢 MINEUR (P3)
- PROBLÈME #1 : Double initialisation du logger
- PROBLÈME #4 : Sync() non garanti
- PROBLÈME #9 : Pas de logging des requêtes lentes
- PROBLÈME #20 : Pas d'error tracking frontend
8. MÉTRIQUES D'IMPACT
Impact sur le Debugging
- Temps moyen pour tracer une requête : ⚠️ IMPOSSIBLE (pas de corrélation)
- Temps pour identifier une erreur : 🔴 ÉLEVÉ (logs dispersés)
- Visibilité des erreurs : 🟡 MOYENNE (certaines erreurs silencieuses)
Impact sur la Performance
- Overhead de logging : 🟡 MOYEN (logs synchrones)
- Stockage des logs : 🟠 ÉLEVÉ (pas de sampling, agrégation désactivée)
Impact sur la Sécurité
- Risque de fuite de secrets : 🔴 ÉLEVÉ (pas de filtre)
- Logs de debug en prod : 🟠 MOYEN (présents mais limités)
9. RECOMMANDATIONS PRIORITAIRES
Phase 1 : Corrections Critiques (1-2 semaines)
- ✅ Implémenter la propagation du Request ID entre tous les services
- ✅ Corriger la configuration du logger selon LOG_LEVEL
- ✅ Implémenter un filtre de secrets dans le logger
- ✅ Remplacer tous les fmt.Println par des logs structurés
Phase 2 : Standardisation (2-3 semaines)
- ✅ Standardiser la configuration de logging (Rust)
- ✅ Implémenter un logger structuré frontend
- ✅ Activer l'agrégation de logs par défaut en production
- ✅ Standardiser les formats de logs (JSON en prod)
Phase 3 : Améliorations (3-4 semaines)
- ✅ Implémenter le sampling des logs
- ✅ Ajouter l'error tracking frontend (Sentry)
- ✅ Implémenter la rotation des logs (Rust)
- ✅ Ajouter le logging asynchrone pour les logs non critiques
10. PROCHAINES ÉTAPES
- Valider ce rapport avec l'équipe
- Prioriser les problèmes selon les besoins business
- Créer des tickets pour chaque problème prioritaire
- Implémenter les corrections par phase
- Valider les corrections avec des tests d'intégration
Fin du rapport d'audit