Skip to content

Logging

Nid utilise un système de logging structuré basé sur Pino côté backend et un logger console léger côté frontend.

Backend

Logger centralisé

Tous les modules backend utilisent le logger centralisé défini dans backend/src/logger.ts :

typescript
import { createLogger } from '../logger'

const logger = createLogger('mon-module')

logger.info({ accountId, messageId }, 'archiving mail')
logger.error({ err }, 'operation failed')
logger.debug({ data }, 'debug info')
logger.warn('something unusual happened')

createLogger(name) crée un child logger Pino qui :

  • Hérite du niveau de log défini par LOG_LEVEL
  • Utilise pino-pretty en développement (sortie colorée et lisible)
  • Produit du JSON structuré en production (pour intégration avec des outils comme Loki, ELK, Datadog)
  • Inclut automatiquement le nom du module dans chaque ligne de log

Configuration

VariableDéfautDescription
LOG_LEVELinfoNiveau minimum : debug, info, warn, error, silent
NODE_ENVdevelopmentEn development, active pino-pretty

Bonnes pratiques

  • Toujours passer le contexte en objet : logger.info({ accountId, jobId }, 'message') plutôt que logger.info('message ' + accountId)
  • Logger les erreurs avec err : logger.error({ err }, 'description') — Pino sérialise automatiquement le stack trace
  • Utiliser debug pour le détail : les informations de debug ne sont visibles qu'avec LOG_LEVEL=debug
  • Ne jamais logger de données sensibles : pas de tokens, mots de passe, clés API

Modules loggés

ModuleFichierOpérations loggées
archivearchive/archive.service.tsArchivage de mails, extraction PJ
archive-workerjobs/workers/archive.worker.tsProgression archivage batch
bulk-workerjobs/workers/bulk.worker.tsOpérations bulk (trash, delete, modify)
rule-workerjobs/workers/rule.worker.tsExécution de règles
rulesrules/rules.service.tsCRUD règles, exécution
oauthauth/oauth.service.tsÉchange de tokens, refresh
social-authauth/social.service.tsAuth multi-provider
gmailgmail/gmail.service.tsAppels Gmail API
gmail-throttlegmail/gmail-throttle.tsRate limiting, retries
workerjobs/workers/unified.worker.tsDispatch des jobs
schedulerjobs/scheduler.tsPlanification des règles
dbdb/index.tsMigrations
analyticsanalytics/analytics.service.tsHeatmap, scores, suggestions
deduparchive/dedup.service.tsDéduplication PJ
exportarchive/export.service.tsExport ZIP
importarchive/import.service.tsImport mbox/IMAP
integrityarchive/integrity.service.tsVérification intégrité
retentionarchive/retention.service.tsPolitiques de rétention
sharingarchive/sharing.service.tsPartage temporaire
storagestorage/storage.service.tsBackend stockage (local/S3)
quotagmail/quota.service.tsSuivi quota API
reportsreports/report.service.tsRapports hebdo
report-schedulerreports/report.scheduler.tsPlanification rapports
notifynotifications/notify.tsNotifications multi-canal
webhookwebhooks/webhook.service.tsDispatch webhooks
auditaudit/audit.service.tsAudit log
expirationexpiration/expiration.service.tsExpiration des mails
encryptionprivacy/encryption.service.tsChiffrement archives
pii-scannerprivacy/pii.service.tsDétection PII
tracking-pixelprivacy/tracking.service.tsDétection pixels espions
unsubscribeunsubscribe/unsubscribe.service.tsScan newsletters
job-sseroutes/job-sse.tsSSE broadcast
mcpmcp-server.tsServeur MCP

Gestion des erreurs Fastify

Le handler d'erreur global (plugins/index.ts) logue automatiquement :

  • Les erreurs de validation Zod (niveau warn) avec les détails
  • Les erreurs client (4xx, niveau warn)
  • Les erreurs serveur (5xx, niveau error) avec l'URL, la méthode et l'ID utilisateur

Frontend

Logger

Le frontend utilise un logger léger défini dans frontend/src/utils/logger.ts :

typescript
import { createLogger } from '../utils/logger'

const logger = createLogger('mon-composant')

logger.info('Action effectuée', { page: 'dashboard' })
logger.error('Erreur API', { url, status })
  • En production : seuls warn et error sont affichés
  • En développement : tous les niveaux sont actifs

Error Boundary

Un composant ErrorBoundary (components/ErrorBoundary.tsx) capture les erreurs React non gérées et les logue avec le component stack.

Interception API

Le client Axios (api/client.ts) logue automatiquement :

  • Les erreurs 401 (niveau warn)
  • Les erreurs 5xx (niveau error)
  • Les erreurs réseau (niveau error)

Erreurs globales

main.tsx capture et logue :

  • Les erreurs non gérées (window.onerror)
  • Les rejections de Promise non gérées (unhandledrejection)