{ "meta": { "title": "Veza Logging Issues TodoList", "description": "30 problèmes de logging identifiés lors de l'audit", "generated_at": "2025-12-27", "total_issues": 30, "by_priority": { "P0_critical": 3, "P1_major": 5, "P2_medium": 12, "P3_minor": 10 } }, "issues": [ { "id": 2, "priority": "P0", "status": "open", "title": "Logger non configuré selon LOG_LEVEL", "description": "Le logger est créé avec zap.NewProduction() AVANT de lire LOG_LEVEL", "file": "veza-backend-api/internal/config/config.go:205", "impact": "Le niveau de log est toujours INFO même si LOG_LEVEL=DEBUG", "fix": "Lire LOG_LEVEL AVANT d'initialiser le logger" }, { "id": 23, "priority": "P0", "status": "open", "title": "Pas de propagation Request ID entre services", "description": "Le request_id n'est pas propagé entre Backend Go, Chat Server et Stream Server", "file": "middleware/, veza-chat-server/, veza-stream-server/", "impact": "CRITIQUE - Impossible de tracer une requête complète", "fix": "Propager X-Request-ID via headers HTTP et RabbitMQ" }, { "id": 30, "priority": "P0", "status": "open", "title": "Risque de logger des secrets", "description": "Tokens, passwords potentiellement loggés dans les erreurs", "file": "internal/logging/", "impact": "CRITIQUE - Fuite de secrets", "fix": "Implémenter un filtre de secrets (regex) dans le logger" }, { "id": 5, "priority": "P1", "status": "open", "title": "Utilisation de fmt.Println dans le code", "description": "12 fichiers avec fmt.Print* - logs non structurés", "file": "veza-backend-api/internal/", "impact": "Logs non structurés, difficiles à parser, pas de corrélation", "fix": "Remplacer tous les fmt.Print* par des logs structurés zap" }, { "id": 7, "priority": "P1", "status": "open", "title": "Middleware logger dupliqué", "description": "Deux middlewares: middleware.Logger() et middleware.RequestLogger()", "file": "internal/middleware/logger.go, internal/middleware/request_logger.go", "impact": "Confusion, logs potentiellement dupliqués", "fix": "Supprimer middleware.Logger() (legacy), utiliser uniquement RequestLogger" }, { "id": 12, "priority": "P1", "status": "open", "title": "Configuration de logging incohérente (Rust)", "description": "Config logging dans main.rs au lieu de veza-common/src/logging.rs", "file": "veza-chat-server/src/main.rs:84-101", "impact": "Duplication de code, configuration incohérente", "fix": "Utiliser veza_common::logging::init() partout" }, { "id": 18, "priority": "P1", "status": "open", "title": "Utilisation massive de console.log (frontend)", "description": "192 occurrences de console.log/error/warn dans 72 fichiers", "file": "apps/web/src/", "impact": "Logs non structurés, pas de corrélation avec backend", "fix": "Migrer vers un logger structuré TypeScript" }, { "id": 26, "priority": "P1", "status": "open", "title": "Agrégation non configurée par défaut", "description": "L'agrégation vers Loki existe mais est désactivée par défaut", "file": "internal/logging/logger_aggregation.go", "impact": "Logs dispersés, difficile à analyser", "fix": "Activer l'agrégation par défaut en production" }, { "id": 6, "priority": "P2", "status": "open", "title": "Logs de debug excessifs", "description": "Logs avec === DEBUG === qui polluent les logs", "file": "internal/handlers/auth.go:150-167", "impact": "Performance et lisibilité", "fix": "Utiliser logger.Debug() au lieu de logger.Info() pour les logs de debug" }, { "id": 10, "priority": "P2", "status": "open", "title": "Erreurs silencieuses", "description": "Certaines erreurs retournées sans être loggées", "file": "internal/core/auth/service.go et autres", "impact": "Perte d'information pour le debugging", "fix": "Logger toutes les erreurs avec contexte" }, { "id": 11, "priority": "P2", "status": "open", "title": "Pas de corrélation avec services Rust", "description": "request_id non propagé vers chat-server et stream-server", "file": "middleware/, veza-common/", "impact": "Impossible de tracer une requête à travers tous les services", "fix": "Propager request_id via headers HTTP et RabbitMQ" }, { "id": 13, "priority": "P2", "status": "open", "title": "Chat server pas de corrélation avec Go", "description": "request_id du backend Go non utilisé", "file": "veza-chat-server/", "impact": "Impossible de tracer une requête complète", "fix": "Extraire X-Request-ID des headers WebSocket/HTTP" }, { "id": 15, "priority": "P2", "status": "open", "title": "Stream server config dupliquée", "description": "Même problème que chat-server, configuration dupliquée", "file": "veza-stream-server/src/main.rs:18-28", "impact": "Duplication de code", "fix": "Utiliser veza-common::logging" }, { "id": 16, "priority": "P2", "status": "open", "title": "Stream server pas de corrélation", "description": "Même problème que chat-server pour la corrélation", "file": "veza-stream-server/", "impact": "Impossible de tracer", "fix": "Extraire X-Request-ID" }, { "id": 17, "priority": "P2", "status": "open", "title": "veza-common logging non utilisé", "description": "Les services Rust n'utilisent pas veza-common::logging", "file": "veza-common/src/logging.rs", "impact": "Code dupliqué, configuration incohérente", "fix": "Refactoriser pour utiliser le module commun" }, { "id": 19, "priority": "P2", "status": "open", "title": "Pas de logger structuré frontend", "description": "Le logger actuel est juste un wrapper autour de console.*", "file": "apps/web/src/utils/logger.ts", "impact": "Pas de format JSON, pas de corrélation", "fix": "Implémenter un logger structuré avec request_id" }, { "id": 21, "priority": "P2", "status": "open", "title": "Logs debug en prod (frontend)", "description": "Logs debug filtrés mais warn/error toujours loggés", "file": "apps/web/src/utils/logger.ts:21-24", "impact": "Pollution des logs en production", "fix": "Configurer niveau de log via variable d'environnement" }, { "id": 22, "priority": "P2", "status": "open", "title": "Frontend pas de corrélation backend", "description": "Les logs frontend n'incluent pas le request_id du backend", "file": "apps/web/", "impact": "Impossible de corréler logs frontend/backend", "fix": "Extraire X-Request-ID des réponses API" }, { "id": 24, "priority": "P2", "status": "open", "title": "Configuration incohérente des niveaux", "description": "Backend: LOG_LEVEL, Rust: RUST_LOG, Frontend: hardcodé", "file": "tous les services", "impact": "Difficile de configurer les niveaux globalement", "fix": "Standardiser sur LOG_LEVEL pour tous les services" }, { "id": 25, "priority": "P2", "status": "open", "title": "Formats de logs incohérents", "description": "Go: JSON prod/console dev, Rust: JSON prod/texte dev, Frontend: console", "file": "tous les services", "impact": "Difficile d'agréger les logs", "fix": "Standardiser sur JSON pour tous les services en production" }, { "id": 1, "priority": "P3", "status": "open", "title": "Double initialisation du logger", "description": "Logger initialisé dans main.go ET dans config.NewConfig()", "file": "cmd/api/main.go:53, internal/config/config.go:205", "impact": "Logger de main.go ignoré, gaspillage de ressources", "fix": "Supprimer l'initialisation dans main.go" }, { "id": 3, "priority": "P3", "status": "open", "title": "Logger temporaire mal utilisé", "description": "Logger temporaire créé puis remplacé, logs initiaux perdus", "file": "internal/config/config.go:205-340", "impact": "Logs de démarrage non envoyés à l'agrégation", "fix": "Initialiser directement le bon logger" }, { "id": 4, "priority": "P3", "status": "open", "title": "Sync() non garanti au shutdown", "description": "defer logger.Sync() peut échouer silencieusement", "file": "cmd/api/main.go:57, internal/config/config.go:1120", "impact": "Perte de logs lors du shutdown", "fix": "Utiliser ShutdownManager pour garantir le flush" }, { "id": 8, "priority": "P3", "status": "open", "title": "RequestLogger non appliqué globalement", "description": "RequestLogger pas visible dans la config des routes", "file": "internal/api/router.go", "impact": "Requêtes peuvent ne pas être loggées", "fix": "Appliquer RequestLogger dans router.go" }, { "id": 9, "priority": "P3", "status": "open", "title": "Pas de logging requêtes lentes", "description": "Les requêtes lentes ne sont pas identifiées automatiquement", "file": "internal/middleware/request_logger.go", "impact": "Difficulté à identifier problèmes de performance", "fix": "Ajouter seuil de latence configurable (ex: >1s = WARN)" }, { "id": 14, "priority": "P3", "status": "open", "title": "Pas de rotation logs (Rust)", "description": "Logs envoyés vers stdout mais pas vers fichiers avec rotation", "file": "veza-chat-server/src/structured_logging.rs", "impact": "Risque de perte de logs", "fix": "Utiliser tracing-appender pour la rotation" }, { "id": 20, "priority": "P3", "status": "open", "title": "Pas d'error tracking frontend", "description": "Pas d'intégration avec Sentry ou autre", "file": "apps/web/", "impact": "Erreurs frontend non trackées", "fix": "Intégrer Sentry pour le frontend" }, { "id": 27, "priority": "P3", "status": "open", "title": "Logs synchrones", "description": "Tous les logs sont synchrones (bloquants)", "file": "internal/logging/", "impact": "Performance dégradée sous charge", "fix": "Utiliser buffers asynchrones pour logs non critiques" }, { "id": 28, "priority": "P3", "status": "open", "title": "Pas de sampling", "description": "Tous les logs envoyés, même les plus verbeux", "file": "internal/logging/", "impact": "Coût élevé en stockage", "fix": "Implémenter sampling pour DEBUG/INFO" }, { "id": 29, "priority": "P3", "status": "open", "title": "Logs debug en prod (backend)", "description": "Logs avec === DEBUG === en production", "file": "internal/handlers/auth.go:150-167", "impact": "Fuite d'information, performance", "fix": "Utiliser logger.Debug() et désactiver en prod" } ], "progress": { "fixed": 0, "open": 30, "percentage": "0%" } }