@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 souswinston-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.
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.
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 souspino-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.
node pino-app.js. Le nom d’hôte et la trace de pile sont raccourcis
ici.
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.
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.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
<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.
