Zum Hauptinhalt springen
LogBrew ist eine Observability-Plattform für Entwickler und Coding-Agenten, mit großzügigem Gratis-Kontingent und ohne Karte. Dieser Leitfaden richtet Logging mit Winston und Pino in Node.js ein, ergänzt einen Express-Logger und sendet jedes Log mit seinem Anfrage-Trace an LogBrew. Jedes Beispiel lief unter Node.js 22 mit Winston 3.19, Pino 10.4, Express 5.3, @logbrew/sdk 0.1.40, @logbrew/node 0.1.24 und @logbrew/express 0.1.10. Jeder Ausgabeblock zeigt die echte Ausgabe.

Winston oder Pino wählen

Beide Bibliotheken schreiben strukturierte JSON-Logs. Behalten Sie die Bibliothek, die Ihre App schon verwendet. Die LogBrew-Einrichtung ist für jede Bibliothek anders.

LogBrew-Projekt vorbereiten

1

Projektschlüssel erstellen

Melden Sie sich mit der CLI an. Erstellen Sie ein Projekt und speichern Sie seinen Ingest-Schlüssel in einer Datei, die nur der Eigentümer lesen kann.
Die CLI gibt den Schlüssel nicht aus. Verwenden Sie in der Produktion den Secret Manager Ihrer Plattform.
2

Pakete installieren

Die Pakete erfordern Node.js 18.19 oder neuer. Installieren Sie Winston, Pino oder beide.
3

Schlüssel und Bereitstellungsidentität setzen

createLogBrewNodeClient() liest den Schlüssel aus LOGBREW_SERVER_API_KEY. Der Dienstname ist der name in package.json. Setzen Sie LOGBREW_SERVICE_NAME, um einen anderen Namen zu verwenden. Die Beispiele verwenden ES-Module. Setzen Sie deshalb "type": "module" in package.json.

Node.js-Log-Levels

Jede Bibliothek hat eigene Level-Namen und Zahlen. LogBrew speichert 4 Levels und behält das ursprüngliche Level in den Metadaten. Bei Winston ist eine niedrigere Zahl schwerwiegender. Bei Pino ist eine höhere Zahl schwerwiegender. Setzen Sie in der Produktion info und debug nur für eine kurze Diagnose.

Winston-Logger

Speichern Sie diese Datei als winston-app.js. Das erste Format verwirft Einträge unter dem Level des Loggers, bevor ein Transport sie erhält. Der LogBrew-Transport erhält jeden Eintrag, den der Logger schreibt. Deshalb braucht er diesen Filter.
Führen Sie node winston-app.js aus. Die Konsole erhält 1 JSON-Zeile pro Eintrag mit info oder höher. Der Stacktrace ist hier gekürzt.
LogBrew erhält dieselben 3 Einträge. Die Felder werden zu Metadaten unter context.*. Der Transport sendet Name und Meldung des Fehlers, aber nicht den Stacktrace. Setzen Sie includeErrorStack: true in createLogBrewWinstonTransport(), um den Stacktrace zu senden. Jede Nachricht wird außerdem zu einem vorherigen Schritt im nächsten Issue. Setzen Sie breadcrumbs: false, um das abzuschalten.

Pino-Logger

Speichern Sie diese Datei als pino-app.js. Rufen Sie installLogBrewPinoInstrumentation() einmal vor dem ersten Log auf. Die Funktion liest jeden fertigen Pino-Eintrag. Pino schreibt weiterhin an sein eigenes Ziel.
Führen Sie node pino-app.js aus. Hostname und Stacktrace sind hier gekürzt.
LogBrew erhält 3 Einträge. Pino verwirft den Eintrag mit debug, bevor LogBrew ihn sieht. Das Feld token kommt nicht in LogBrew an. LogBrew verwirft Felder für Zugangsdaten, Cookies, Bodys, Query-Strings, URLs und Stacktraces. Die Pfade in Ihrer Pino-Option redact bleiben als zweite Kontrolle aktiv. pid, hostname und time sind Standardfelder von Pino. Deshalb kopiert LogBrew sie nicht. Die automatische Erfassung erfordert Pino 9.11 oder neuer in der Reihe 9.x oder Pino 10.1 oder neuer. Für ältere Pino-Versionen verwenden Sie createLogBrewPinoDestination() aus @logbrew/sdk als Pino-Ziel. Um die Pino-Ausgabe in der Entwicklung zu lesen, leiten Sie sie an pino-pretty weiter.

Express-Logger

logbrewMiddleware() erstellt 1 Anfrage-Span pro Anfrage. logbrewErrorHandler() meldet Fehler als Issues. Ein Pino-Log innerhalb einer Anfrage erhält die Trace-ID und die Span-ID dieser Anfrage. Speichern Sie diese Datei als express-app.js.
Starten Sie die App. Senden Sie dann 2 Anfragen aus einem zweiten Terminal.
LogBrew erhält diese Ereignisse. Log und Span jeder Anfrage haben dieselbe Trace-ID. Der Span-Name verwendet die Routenvorlage, nicht den konkreten Pfad. Das Log listening on 3000 hat keinen Trace, weil es außerhalb einer Anfrage entsteht. Lassen Sie die Middleware ihre eigenen Anfrage-Clients erstellen. Übergeben Sie den prozessweiten client nicht an logbrewMiddleware() oder logbrewErrorHandler(). Die Middleware fährt ihren Anfrage-Client nach jeder Antwort herunter.

Trace zu Winston-Logs hinzufügen

Bei Winston übergeben Sie dem Transport den aktiven Trace.
Fügen Sie logbrewTransport zur Liste transports des Loggers hinzu. Ein Winston-Log innerhalb einer Express-Anfrage hat dann die Trace-ID und die Span-ID der Anfrage.

Logs zurücklesen

Der letzte Befehl liest alle Logs von 1 Anfrage. Kopieren Sie <trace_id> aus einem Trace oder einem Issue. Für Lesezugriffe aus CI oder von einem Coding-Agenten verwenden Sie einen Projekt-Leseschlüssel. Siehe Einrichtung prüfen.

Ohne verlorene Logs herunterfahren

Der Client sendet wartende Ereignisse 1 Sekunde nach dem ersten Ereignis oder bei 50 Ereignissen. Wenn die Event Loop leer ist, sendet der Client die restlichen Ereignisse höchstens 2 Sekunden lang. process.exit() und Signale überspringen diesen Schritt. Rufen Sie await client.shutdown() vor dem Beenden auf, so wie der Handler für SIGTERM im Express-Beispiel.

Probleme beheben

Zur Wahl der Log-Felder siehe Structured Logging. Für andere Frameworks siehe SDK-Integration.