Node.js 如何在环回4中跟踪请求id?

Node.js 如何在环回4中跟踪请求id?,node.js,strongloop,loopback,loopback4,log4js-node,Node.js,Strongloop,Loopback,Loopback4,Log4js Node,我尝试使用Loopback 4跟踪REST API中的每个HTTP请求,以便使用log4js将它们记录在控制器中,如下所示: [2020-05-05T19:21:52.191] [INFO] [request-id:47e9a486-1243-1c07-3ac0-0acc9cce2c0e] user.controller.ts - starting request validation [2020-05-05T19:21:52.191] [INFO] [request-id:1dc81e45-0

我尝试使用Loopback 4跟踪REST API中的每个HTTP请求,以便使用log4js将它们记录在控制器中,如下所示:

[2020-05-05T19:21:52.191] [INFO] [request-id:47e9a486-1243-1c07-3ac0-0acc9cce2c0e] user.controller.ts - starting request validation
[2020-05-05T19:21:52.191] [INFO] [request-id:1dc81e45-093a-8009-42d2-e545c3a10c9d] user.controller.ts - starting request validation
[2020-05-05T19:21:53.126] [INFO] [request-id:47e9a486-1243-1c07-3ac0-0acc9cce2c0e] user.controller.ts - request validation success
[2020-05-05T19:21:53.145] [ERROR] [request-id:1dc81e45-093a-8009-42d2-e545c3a10c9d] user.controller.ts - request validation failed
主要问题是
[request id:UUID]
部分,因为Node.js有时会混淆日志,我无法识别它们中哪些属于同一请求。我已经找到了一些针对Express应用程序的解决方案,但我找不到一种方法来使用Loopback 4和log4js:


解决方案可能涉及使用序列处理程序,但我还不知道如何做。注入请求对象的一些提示:

我们使用winston logger完成了这项工作,winston logger作为记录器服务注入到我们的sequence.ts中。这是sequence.ts的代码

导出类MySequence实现SequenceHandler{
建造师(
@注入(SequenceActions.FIND_ROUTE)受保护的findRoute:findRoute,
@inject(SequenceActions.PARSE_PARAMS)受保护的parseParams:parseParams,
@inject(SequenceActions.INVOKE_方法)受保护的INVOKE:InvokeMethod,
@注入(SequenceActions.SEND)公共发送:发送,
@注入(SequenceActions.REJECT)公共拒绝:拒绝,
@inject(LOGGER.LOGGER\u inject)公共记录器:ILogger,
@注入(头盔安全绑定。头盔安全动作)
防护头盔:头盔,
@注入(RateLimitSecurityBindings.RATELIMIT\u安全\u操作)
受保护的rateLimitAction:rateLimitAction,
@注入(AlivioBindings.i18n)
受保护的i18n:i18nAPI,
) {}
异步句柄(上下文:RequestContext){
const requestTime=Date.now();
试一试{
const{request,response}=context;
此为.logger.info(
`请求${Request.method}${
request.url
}从${requestTime.toString()}开始。
请求详细信息
Referer=${request.headers.Referer}
用户代理=${request.headers['User-Agent']}
远程地址=${request.connection.remoteAddress}
远程地址(代理)=${request.headers['x-forwarded-for']}`,
);
const route=this.findulote(请求);
const args=wait this.parseParams(请求、路由);
等待此操作(请求、响应);
等待这一点。头盔转移(请求、响应);
request.body=args[args.length-1];
const result=wait this.invoke(路由,参数);
发送(响应、结果);
}捕捉(错误){
这是一个错误(
`请求${context.Request.method}${
context.request.url
}出错。错误:${JSON.stringify(err)}${err}`,
);
拒绝(上下文、错误);
}最后{
此为.logger.info(
`请求${context.Request.method}${
context.request.url
}已在${Date.now()-requestTime}ms`中完成,
);
}
}

}
谢谢你,萨马尔潘。我对我的回答作了一些解释。我的主要问题是将请求标识符记录在控制器类中,以避免它们混淆。