Przejdź do głównej treści
LogBrew to platforma obserwowalności dla programistów i agentów kodujących. Ma hojny darmowy plan i nie wymaga karty. Ten przewodnik konfiguruje logowanie z bibliotekami Winston i Pino w Node.js, dodaje logger dla Express i wysyła każdy log do LogBrew razem ze śladem żądania. Każdy przykład uruchomiono w Node.js 22 z Winston 3.19, Pino 10.4, Express 5.3, @logbrew/sdk 0.1.40, @logbrew/node 0.1.24 i @logbrew/express 0.1.10. Każdy blok wyniku pokazuje prawdziwy wynik.

Wybierz Winston albo Pino

Obie biblioteki zapisują logi strukturalne w JSON. Zostań przy bibliotece, której twoja aplikacja już używa. Konfiguracja LogBrew jest inna dla każdej z nich.

Przygotuj projekt LogBrew

1

Utwórz klucz projektu

Zaloguj się w CLI. Utwórz projekt i zapisz jego klucz wysyłania w pliku, który może czytać tylko właściciel.
CLI nie wyświetla klucza. Na produkcji używaj menedżera sekretów swojej platformy.
2

Zainstaluj pakiety

Pakiety wymagają Node.js 18.19 lub nowszego. Zainstaluj Winston, Pino lub obie biblioteki.
3

Ustaw klucz i tożsamość wdrożenia

createLogBrewNodeClient() odczytuje klucz z LOGBREW_SERVER_API_KEY. Nazwa usługi to pole name z package.json. Ustaw LOGBREW_SERVICE_NAME, aby użyć innej nazwy. Przykłady używają modułów ES, więc ustaw "type": "module" w package.json.

Poziomy logowania w Node.js

Każda biblioteka ma własne nazwy i liczby poziomów. LogBrew zapisuje 4 poziomy, a pierwotny poziom zachowuje w metadanych. W Winstonie poważniejszy poziom ma niższą liczbę. W Pino poważniejszy poziom ma wyższą liczbę. Na produkcji ustaw info, a debug włączaj tylko na czas krótkiej diagnozy.

Logger Winston

Zapisz ten plik jako winston-app.js. Pierwszy format odrzuca rekordy poniżej poziomu loggera, zanim dostanie je jakikolwiek transport. Transport LogBrew dostaje każdy rekord, który zapisuje logger, więc potrzebuje tego filtra.
Uruchom node winston-app.js. Konsola dostaje 1 wiersz JSON na każdy rekord z poziomem info lub wyższym. Stos jest tu skrócony.
LogBrew dostaje te same 3 rekordy. Pola trafiają do metadanych context.*. Transport wysyła nazwę i komunikat błędu, ale nie stos. Aby wysłać stos, ustaw includeErrorStack: true w createLogBrewWinstonTransport(). Każdy komunikat staje się też breadcrumbem następnego problemu. Aby to wyłączyć, ustaw breadcrumbs: false.

Logger Pino

Zapisz ten plik jako pino-app.js. Wywołaj installLogBrewPinoInstrumentation() jeden raz, przed pierwszym logiem. Ta funkcja odczytuje każdy gotowy rekord Pino. Pino nadal zapisuje logi do własnego miejsca docelowego.
Uruchom node pino-app.js. Nazwa hosta i stos są tu skrócone.
LogBrew dostaje 3 rekordy. Pino odrzuca rekord debug, zanim zobaczy go LogBrew. Pola token nie ma w LogBrew. LogBrew odrzuca pola z poświadczeniami, plikami cookie, treścią żądania, parametrami zapytania, adresami URL i stosem. Ścieżki redact z Pino działają jako druga warstwa ochrony. pid, hostname i time to domyślne pola Pino, więc LogBrew ich nie kopiuje. Automatyczne przechwytywanie wymaga Pino 9.11 lub nowszego z linii 9.x albo Pino 10.1 lub nowszego. Dla starszych wersji Pino użyj createLogBrewPinoDestination() z @logbrew/sdk jako miejsca docelowego Pino. Aby czytelnie przeglądać wynik Pino w środowisku deweloperskim, przekaż go do pino-pretty.

Logger dla Express

logbrewMiddleware() tworzy 1 span żądania na każde żądanie. logbrewErrorHandler() zgłasza błędy jako problemy. Log Pino wewnątrz żądania dostaje ID śladu i ID spanu tego żądania. Zapisz ten plik jako express-app.js.
Uruchom aplikację. Potem wyślij 2 żądania z drugiego terminala.
LogBrew dostaje te zdarzenia. Log i span każdego żądania mają to samo ID śladu. Nazwa spanu używa szablonu trasy, a nie konkretnej ścieżki. Log listening on 3000 nie ma śladu, bo powstaje poza żądaniem. Pozwól, aby middleware tworzył własnych klientów żądań. Nie przekazuj do logbrewMiddleware() ani do logbrewErrorHandler() klienta client, który jest wspólny dla całego procesu. Middleware zamyka swojego klienta żądania po każdej odpowiedzi.

Dodaj ślad do logów Winstona

W Winstonie przekaż transportowi aktywny ślad.
Dodaj logbrewTransport do listy transports loggera. Log Winstona wewnątrz żądania Express ma wtedy ID śladu i ID spanu tego żądania.

Odczytaj logi

Ostatnie polecenie odczytuje wszystkie logi 1 żądania. Skopiuj <trace_id> ze śladu lub z problemu. Aby czytać logi z CI lub z agenta kodującego, użyj klucza odczytu projektu. Szczegóły znajdziesz w przewodniku Sprawdź konfigurację.

Zamknij aplikację bez utraty logów

Klient wysyła zdarzenia z kolejki 1 sekundę po pierwszym zdarzeniu albo po zebraniu 50 zdarzeń. Gdy pętla zdarzeń jest pusta, klient przez najwyżej 2 sekundy wysyła pozostałe zdarzenia. process.exit() i sygnały pomijają ten krok. Przed wyjściem wywołaj await client.shutdown(), tak jak robi to handler SIGTERM w przykładzie dla Express.

Rozwiązywanie problemów

Wybór pól logów opisuje przewodnik Logowanie strukturalne. Inne frameworki opisuje przewodnik Integracja SDK.