typescript - NestJS logg unik forespørselslogg
Jeg ønsker å implementere logging i NestJS HTTP-tjenesten slik at hver innkommende forespørsel får sin traceId og den logges med logglinjen. Best ville være noe slikt:
[LogInterceptor, traceId=b57847d0-ed31-11e9-969e-7dd13d8a9c1e] Before getUser at 1570911778049.
[UsersController, traceId=b57847d0-ed31-11e9-969e-7dd13d8a9c1e] Getting user...
[UsersService] Looking for user by id [testLocal]...
Her, som du kan se, mangler jeg traceId i UsersService-logglinjen fordi jeg ikke vet hvordan jeg rimelig kan håndtere full vertikal ved bruk av request-basert logger uten å bruke Scope.REQUEST injeksjonsscope. Jeg ville prøvd å unngå å kaskadere alle mine leverandører til REQUEST-scope av ytelsesårsaker.
Og jeg klarte å komme så langt ved å fange opp innkommende forespørsel, tildele en traceId til den, opprette en logger med traceId og koble den til forespørselen. Deretter injiserer jeg i controlleren en egendefinert parameterdekoratør (med controllerklassens navn slik at den plukker opp den første delen av loggerkonteksten).
Og på grunn av naturen til NodeJS, tror jeg det er så langt jeg kan komme. Jeg kommer fra Java-verdenen hvor vi kunne håndtere dette ved å bruke tråder og deres lokale variabler eller forskjellige trådbaserte løsninger. Hva er den beste løsningen for dette i dette økosystemet?
Bruksområdet er et produksjonsklar loggsystem som er i stand til å korrelere logger fra forskjellige deler av koden basert på en unik forespørselsidentifikator.
REDIGER: For en tid siden har jeg sett Async Hooks i NodeJS. Jeg glemte å gå i den retningen under denne undersøkelsen. Men ved et raskt blikk, er de fortsatt eksperimentelle funksjoner. Noen kommentarer på løsninger basert på dem?
Svar #1
Du kan prøve nestjs-pino, det logger hvert svar med overskrifter, og har også request-kontekst når du bruker det som LoggerService, det fungerer på toppen av async_hooks (cls-hooked) og bruker ikke Scope.REQUEST.
For en tid siden har jeg sett Async Hooks i NodeJS. Jeg glemte å gå i den retningen under denne undersøkelsen. Men ved et raskt blikk er de fortsatt en eksperimentell funksjon. Noen kommentarer om løsninger basert på dem?
cls-hooked har mer enn 200 000 ukentlige installasjoner, og jeg bruker nestjs-pino i produksjon (med nodejs 12), og har ikke hatt noen problemer med det så langt.
Oppdatering: nå bruker biblioteket AsyncLocalStorage som er merket som stabilt API siden [email .
Ansvarsfraskrivelse: Jeg er forfatteren.