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 :
| Niveau | Couleur | Patterns détectés |
|---|---|---|
error | Rouge | ERROR, ERR, FATAL, CRIT |
warn | Orange | WARN, WARNING |
info | Blanc | INFO, LOG |
debug | Gris | DEBUG, 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 UIContraintes 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 :
- Ouvrez la config du service → onglet Logs
- Glissez-déposez les parsers dans l'ordre d'exécution voulu
- Sauvegardez
L'ordre est significatif — un parser peut modifier la ligne avant que le suivant ne la reçoive.