# 🔍 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:53` et `internal/config/config.go:205` - **Description** : Le logger est initialisĂ© deux fois : 1. Dans `main.go` avec `zap.NewProduction()` (ligne 53) 2. Dans `config.NewConfig()` avec `zap.NewProduction()` (ligne 205) - **Impact** : Le logger de `main.go` est ignorĂ©, gaspillage de ressources - **Solution** : Supprimer l'initialisation dans `main.go`, utiliser uniquement celui de `config.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 lire `LOG_LEVEL` - **Code problĂ©matique** : ```go 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 `INFO` mĂȘme si `LOG_LEVEL=DEBUG` est dĂ©fini - **Solution** : Lire `LOG_LEVEL` AVANT d'initialiser le logger, ou utiliser `NewLoggerWithAggregation` qui 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 `ShutdownManager` existant 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` : Multiples `logger.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 de `logger.Info()` pour les logs de debug ### 1.3 Middleware de Logging HTTP #### ✅ Points Positifs - Middleware `RequestLogger` bien structurĂ© - Support du `request_id` pour la corrĂ©lation - Support de `trace_id` et `span_id` (T0025) - Logs structurĂ©s avec contexte complet #### ❌ ProblĂšmes IdentifiĂ©s **PROBLÈME #7 : Middleware Logger DupliquĂ©** - **Fichier** : `internal/middleware/logger.go` et `internal/middleware/request_logger.go` - **Description** : Deux middlewares de logging existent : 1. `middleware.Logger()` - format texte simple (Gin standard) 2. `middleware.RequestLogger()` - format structurĂ© avec zap - **Impact** : Confusion, logs dupliquĂ©s si les deux sont utilisĂ©s - **Solution** : Supprimer `middleware.Logger()` (legacy), utiliser uniquement `RequestLogger` **PROBLÈME #8 : RequestLogger Non AppliquĂ© Globalement** - **Fichier** : `internal/api/router.go` - **Description** : Le `RequestLogger` n'est pas visible dans la configuration des routes - **Impact** : Les requĂȘtes peuvent ne pas ĂȘtre loggĂ©es correctement - **Solution** : VĂ©rifier et appliquer `RequestLogger` dans `router.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 `ErrorHandler` bien 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.go` et 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_id` n'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_id` via 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.rs` au lieu d'utiliser `veza-common/src/logging.rs` - **Impact** : Duplication de code, configuration incohĂ©rente - **Solution** : Utiliser `veza_common::logging::init()` ou `init_with_config()` **PROBLÈME #13 : Pas de CorrĂ©lation avec Backend Go** - **Description** : Le `request_id` du backend Go n'est pas propagĂ© au chat server - **Impact** : Impossible de tracer une requĂȘte complĂšte - **Solution** : Extraire `X-Request-ID` des 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-appender` pour 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.rs` centralisĂ© 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/warn` dans 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 `debug` et `info` sont filtrĂ©s en prod, mais `warn` et `error` sont 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_id` du backend - **Impact** : Impossible de corrĂ©ler les logs frontend/backend - **Solution** : Extraire `X-Request-ID` des 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_id` n'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-ID` via headers HTTP - Propager via RabbitMQ (metadata) - Utiliser OpenTelemetry pour le tracing distribuĂ© ### 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_LEVEL` pour 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) 1. **PROBLÈME #23** : Pas de propagation du Request ID entre services 2. **PROBLÈME #30** : Risque de logger des secrets 3. **PROBLÈME #2** : Logger non configurĂ© selon LOG_LEVEL ### 🟠 MAJEUR (P1) 4. **PROBLÈME #5** : Utilisation de fmt.Println (12 fichiers) 5. **PROBLÈME #18** : 192 console.log dans le frontend 6. **PROBLÈME #12** : Configuration de logging incohĂ©rente (Rust) 7. **PROBLÈME #7** : Middleware logger dupliquĂ© 8. **PROBLÈME #26** : AgrĂ©gation non configurĂ©e par dĂ©faut ### 🟡 MOYEN (P2) 9. **PROBLÈME #6** : Logs de debug excessifs 10. **PROBLÈME #10** : Erreurs silencieuses 11. **PROBLÈME #19** : Pas de logger structurĂ© frontend 12. **PROBLÈME #24** : Configuration incohĂ©rente des niveaux ### 🟱 MINEUR (P3) 13. **PROBLÈME #1** : Double initialisation du logger 14. **PROBLÈME #4** : Sync() non garanti 15. **PROBLÈME #9** : Pas de logging des requĂȘtes lentes 16. **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) 1. ✅ ImplĂ©menter la propagation du Request ID entre tous les services 2. ✅ Corriger la configuration du logger selon LOG_LEVEL 3. ✅ ImplĂ©menter un filtre de secrets dans le logger 4. ✅ Remplacer tous les fmt.Println par des logs structurĂ©s ### Phase 2 : Standardisation (2-3 semaines) 5. ✅ Standardiser la configuration de logging (Rust) 6. ✅ ImplĂ©menter un logger structurĂ© frontend 7. ✅ Activer l'agrĂ©gation de logs par dĂ©faut en production 8. ✅ Standardiser les formats de logs (JSON en prod) ### Phase 3 : AmĂ©liorations (3-4 semaines) 9. ✅ ImplĂ©menter le sampling des logs 10. ✅ Ajouter l'error tracking frontend (Sentry) 11. ✅ ImplĂ©menter la rotation des logs (Rust) 12. ✅ Ajouter le logging asynchrone pour les logs non critiques --- ## 10. PROCHAINES ÉTAPES 1. **Valider ce rapport** avec l'Ă©quipe 2. **Prioriser les problĂšmes** selon les besoins business 3. **CrĂ©er des tickets** pour chaque problĂšme prioritaire 4. **ImplĂ©menter les corrections** par phase 5. **Valider les corrections** avec des tests d'intĂ©gration --- **Fin du rapport d'audit**