veza/LOGGING_ISSUES_TODOLIST.json

322 lines
12 KiB
JSON
Raw Normal View History

{
"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%"
}
}