Passer au contenu principal
LogBrew est une plateforme d’observabilité pour les développeurs et les agents de codage, avec une offre gratuite généreuse et sans carte bancaire. Ce guide configure le logging Winston et le logging Pino dans Node.js, ajoute un logger Express et envoie chaque log à LogBrew avec la trace de sa requête. Chaque exemple a tourné sous Node.js 22 avec Winston 3.19, Pino 10.4, Express 5.3, @logbrew/sdk 0.1.40, @logbrew/node 0.1.24 et @logbrew/express 0.1.10. Chaque bloc de sortie montre la sortie réelle.

Choisir Winston ou Pino

Les deux bibliothèques écrivent des logs JSON structurés. Gardez la bibliothèque que votre app utilise déjà. La configuration LogBrew diffère pour chacune.

Préparer un projet LogBrew

1

Créer une clé de projet

Connectez-vous avec la CLI. Créez un projet et stockez sa clé d’ingestion dans un fichier lisible par son seul propriétaire.
La CLI n’affiche pas la clé. En production, utilisez le gestionnaire de secrets de votre plateforme.
2

Installer les paquets

Les paquets exigent Node.js 18.19 ou plus récent. Installez Winston, Pino ou les deux.
3

Définir la clé et l’identité de déploiement

createLogBrewNodeClient() lit la clé dans LOGBREW_SERVER_API_KEY. Le nom du service est le name de package.json. Définissez LOGBREW_SERVICE_NAME pour utiliser un autre nom. Les exemples utilisent des modules ES. Définissez donc "type": "module" dans package.json.

Niveaux de log Node.js

Chaque bibliothèque a ses propres noms et valeurs de niveau. LogBrew stocke 4 niveaux et garde le niveau d’origine dans les métadonnées. Dans Winston, une valeur plus basse est plus grave. Dans Pino, une valeur plus haute est plus grave. Utilisez info en production, et debug seulement pour un diagnostic court.

Logger Winston

Enregistrez ce fichier sous winston-app.js. Le premier format écarte les enregistrements sous le niveau du logger avant qu’un transport les reçoive. Le transport LogBrew reçoit chaque enregistrement que le logger écrit. Il a donc besoin de ce filtre.
Exécutez node winston-app.js. La console reçoit 1 ligne JSON par enregistrement de niveau info ou plus. La trace de pile est raccourcie ici.
LogBrew reçoit les mêmes 3 enregistrements. Les champs deviennent des métadonnées context.*. Le transport envoie le nom et le message de l’erreur, mais pas la trace de pile. Définissez includeErrorStack: true dans createLogBrewWinstonTransport() pour envoyer la trace de pile. Chaque message devient aussi un breadcrumb du problème suivant. Définissez breadcrumbs: false pour désactiver ce comportement.

Logger Pino

Enregistrez ce fichier sous pino-app.js. Appelez installLogBrewPinoInstrumentation() une seule fois, avant le premier log. La fonction lit chaque enregistrement Pino terminé. Pino écrit toujours vers sa propre destination.
Exécutez node pino-app.js. Le nom d’hôte et la trace de pile sont raccourcis ici.
LogBrew reçoit 3 enregistrements. Pino écarte l’enregistrement debug avant que LogBrew le voie. Le champ token n’arrive pas dans LogBrew. LogBrew écarte les champs d’identifiants, de cookies, de corps, de paramètres de requête, d’URL et de trace de pile. Il garde vos chemins redact de Pino comme second contrôle. pid, hostname et time sont des valeurs par défaut de Pino. LogBrew ne les copie donc pas. La capture automatique exige Pino 9.11 ou plus récent dans la branche 9.x, ou Pino 10.1 ou plus récent. Pour les versions plus anciennes de Pino, utilisez createLogBrewPinoDestination() de @logbrew/sdk comme destination Pino. Pour lire la sortie de Pino en développement, envoyez-la vers pino-pretty.

Logger Express

logbrewMiddleware() crée 1 span de requête par requête. logbrewErrorHandler() signale les erreurs comme problèmes. Un log Pino dans une requête reçoit l’ID de trace et l’ID de span de cette requête. Enregistrez ce fichier sous express-app.js.
Démarrez l’app. Envoyez ensuite 2 requêtes depuis un second terminal.
LogBrew reçoit ces signaux. Le log et le span de chaque requête ont le même ID de trace. Le nom du span utilise le modèle de route, pas le chemin concret. Le log listening on 3000 n’a pas de trace, car il est écrit hors d’une requête. Laissez le middleware créer ses propres clients de requête. Ne passez pas le client global du processus à logbrewMiddleware() ou logbrewErrorHandler(). Le middleware arrête son client de requête après chaque réponse.

Ajouter la trace aux logs Winston

Pour Winston, donnez la trace active au transport.
Ajoutez logbrewTransport à la liste transports du logger. Un log Winston dans une requête Express a alors l’ID de trace et l’ID de span de la requête.

Relire les logs

La dernière commande lit tous les logs d’une seule requête. Copiez <trace_id> depuis une trace ou un problème. Pour lire depuis la CI ou un agent de codage, utilisez une clé de lecture du projet. Consultez Vérifier la configuration.

Arrêter sans perdre de logs

Le client envoie les signaux en file d’attente 1 seconde après le premier signal ou dès 50 signaux. Quand la boucle d’événements est vide, le client envoie les signaux restants pendant 2 secondes au plus. process.exit() et les signaux système sautent cette étape. Appelez await client.shutdown() avant de quitter, comme le fait le handler SIGTERM de l’exemple Express.

Dépannage

Pour choisir les champs de log, consultez Logs structurés. Pour les autres frameworks, consultez Intégration du SDK.