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