Skip to content

Logs & Parsers

Runeya streame les logs de vos processus en temps réel et permet de les transformer via des parsers JavaScript configurables.

Interface de logs

Dans le panneau de logs d'un service :

  • Streaming temps réel via WebSocket
  • Filtres : niveau de log, texte libre, stream (stdout/stderr)
  • Effacer les logs du buffer (ne touche pas les parsers actifs)
  • Export des logs affichés

Niveaux de log

Runeya détecte automatiquement le niveau des logs via des patterns regex :

NiveauCouleurPatterns détectés
errorRougeERROR, ERR, FATAL, CRIT
warnOrangeWARN, WARNING
infoBlancINFO, LOG
debugGrisDEBUG, TRACE, VERBOSE

Parsers JavaScript

Les parsers permettent de transformer chaque ligne de log avant affichage. Ils s'exécutent en pipeline : la sortie de l'un est l'entrée du suivant.

Interface LogLine

typescript
interface LogLine {
  raw: string       // Texte brut (immutable)
  stream: string    // 'stdout' | 'stderr' (immutable)
  level: string     // Niveau détecté (mutable)
  message: string   // Message affiché (mutable)
  hidden: boolean   // Masquer la ligne (mutable)
  metadata: object  // Données enrichies (mutable)
  json?: object     // Si la ligne est du JSON valide
}

Créer un parser (v2)

javascript
// Signature v2 : reçoit une LogLine, retourne une LogLine
(line) => {
  // Parser JSON automatique
  if (line.json) {
    return {
      ...line,
      level: line.json.level || line.level,
      message: line.json.message || line.raw,
      metadata: line.json,
    }
  }
  return line  // Passe-through si non applicable
}

Exemples pratiques

Parser JSON structuré (winston, pino...) :

javascript
(line) => {
  if (!line.json) return line
  return {
    ...line,
    level: line.json.level ?? line.level,
    message: line.json.msg ?? line.json.message ?? line.raw,
    metadata: { service: line.json.service, trace: line.json.trace },
  }
}

Masquer les lignes de healthcheck :

javascript
(line) => {
  if (line.raw.includes('GET /health')) {
    return { ...line, hidden: true }
  }
  return line
}

Extraire un timestamp custom :

javascript
(line) => {
  const match = line.raw.match(/^\[(\d{4}-\d{2}-\d{2}T[^\]]+)\] (.+)/)
  if (match) {
    return {
      ...line,
      message: match[2],
      metadata: { ...line.metadata, timestamp: match[1] },
    }
  }
  return line
}

Pipeline d'exécution

Ligne brute du processus


   detectLevel()     ← regex automatique (étape 0)


   Parser 1          ← dans l'ordre de la liste


   Parser 2


   ...


   Sanitisation      ← message tronqué à 16KB, max 100 metadata


   Affichage UI

Contraintes de sécurité

Les parsers s'exécutent dans un sandbox Node.js (vm.Script) avec :

  • Timeout de 100ms par ligne
  • Pas d'accès à require, import, eval
  • Pas d'accès au système de fichiers ou réseau
  • En cas d'erreur : la ligne passe au parser suivant sans modification

Gérer les parsers

Les parsers globaux sont définis dans Paramètres → Log Parsers.

Pour les attacher à un service :

  1. Ouvrez la config du service → onglet Logs
  2. Glissez-déposez les parsers dans l'ordre d'exécution voulu
  3. Sauvegardez

L'ordre est significatif — un parser peut modifier la ligne avant que le suivant ne la reçoive.

Publié sous licence MIT.