- Archiver 131 .md dans docs/archive/root-md/ - Archiver 22 .json dans docs/archive/root-json/ - Conserver 7 .md utiles (README, CONTRIBUTING, CHANGELOG, etc.) - Conserver package.json, package-lock.json, turbo.json - Ajouter README d'index dans chaque archive
321 lines
12 KiB
JSON
321 lines
12 KiB
JSON
{
|
|
"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%"
|
|
}
|
|
}
|