Отслеживание уникального запроса журнала NestJS - PullRequest
1 голос
/ 13 октября 2019

Я хочу реализовать ведение журнала в службе HTTP NestJS, чтобы каждый входящий запрос получал свой traceId и регистрировался со строкой журнала. Лучше всего было бы что-то вроде этого:

[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]...

Здесь, как вы можете видеть, я пропускаю traceId в UsersService строке журнала, потому что я не знаю, как разумно иметь дело с полной вертикалью, используярегистратор на основе запросов без использования области ввода Scope.REQUEST . Я бы попытался избежать каскадирования всех моих провайдеров в область действия REQUEST по соображениям производительности.

И мне удалось добиться этого, перехватив входящий запрос, присвоив ему traceId, создав экземпляр логгера с помощью traceId и прикрепив его. запрашивать. Затем в контроллере я внедряю собственный декоратор параметров (с именем класса контроллера, чтобы он брал первую часть контекста логгера).

И из-за природы NodeJS, я считаю, что это насколько я могу получить,Я из мира Java, где мы могли бы справиться с этим, используя потоки и их локальные переменные или различные решения на основе потоков. Каково лучшее решение для этого в этой экосистеме?

Вариант использования - это система ведения журналов производственного класса, которая может сопоставлять журналы из разных частей кода на основе уникального идентификатора запроса.

РЕДАКТИРОВАТЬ: Некоторое время назад я 'Я видел Async Hooks в NodeJS. Я забыл идти в этом направлении во время этого расследования. Но на первый взгляд, они все еще экспериментальная функция. Любые комментарии по решениям на их основе?

1 Ответ

0 голосов
/ 16 октября 2019

Вы можете попробовать nestjs-pino , он регистрирует каждый ответ с заголовками, а также имеет контекст запроса при использовании его как LoggerService, он работает поверх async_hooks ( cls-перехватил ) и не использовал Scope.REQUEST.

Некоторое время назад я видел Async Hooks в NodeJS. Я забыл идти в этом направлении во время этого расследования. Но на первый взгляд, они все еще экспериментальная функция. Любые комментарии по решениям на их основе?

cls-hooked имеет более 200 000 установок в неделю, и я использую nestjs-pino в производстве (с nodejs 12), и до сих пор с ним не было проблем.

...