我正在尝试使用morgan记录我的api服务器的请求。我的路线配置如下:
app.use logger('dev')
app.use '/api/collab/dataobjects/:do', if config.disable_auth then authMid.noAuthCheck else authMid.authCheck
app.use '/api/collab/dataobjects/:do', queryRouter(config.testing)
app.use '/api/collab/dataobjects/:do', queryRouter()
app.use (req, res, next) ->
console.warn "Test"
err = new Error('Not Found')
err.status = 404
next err
app.use (err, req, res, next) ->
res.status(err.status || 500)
console.warn err
res.send {
message: err.message
error: err
}
摩根大都按预期工作,但在一些路线上会产生一些废话。
POST / api / collab / dataobjects / 1 / update--ms--
在检查了一些时间之后,很明显,摩根正在记录这些响应,然后才真正将它们返回。为了解决这个问题,我在api路由之后但在错误捕获路由之前将
app.use logger('dev')
行移动了。放置在此处,Morgan会显示状态代码和长请求的大小,这与以前不同,但是现在在所有请求上都不会显示花费的时间;GET / api / collab / dataobjects / 1 200-ms-4119
Morgan为什么无法显示响应时间,我该如何解决?
最佳答案
我刚刚注意到这个问题现在已经2岁多了,但是我已经做完了工作,所以无论如何我都会发表我的回答。
我本人也遇到过类似的问题,所以我花了一些时间来研究解决这个问题。我不确定是否可以完全回答您的问题(还可以吗?),但是我可以解释您看到的一些情况:
启动计时器:
Morgan在调用中间件处理程序方法(带有(req, res, next)
签名的方法)时启动其计时器,因此在这种情况下:
app.use logger('dev')
app.use '/api/foo/:bar', handler
报告的时间应包括处理
/api/foo/:bar
的时间,但是这种情况:app.use '/api/foo/:bar', handler
app.use logger('dev')
它不应该包括处理
/api/foo/:bar
的时间,因为计时器是在handler
方法运行后启动的。停止计时器:
Morgan在格式化要写入的日志行之前不会停止计时器。
除非另行配置(例如,使用
immediate
选项),否则在响应被完全处理之前,Morgan不会将行写到日志中,当 express 请求处理完成时,使用on-finished模块来回调该行。报告
-
表示响应时间我认为有几种情况会导致Morgan编写
-
而不是响应时间:-
写入日志,因此编写-
表示该值或多或少为“null”。 -
写入日志。 (在这种情况下,我猜-
或多或少表示“无穷大”)。 -
,这也许可以解释为什么将-
代码移到实际路线下方后,总是一直看到app.use(logger)
。或者,由于在第二种情况下Morgan调用onFinished
时可能已经处理了响应,所以可能在写入临时开始时间变量之前立即触发完成的回调,从而导致#1。 为什么MORGAN有时会在您的原始设置中写
-
?我认为最可能的情况是,您的“长期运行”请求正在根据基础结构的一部分或另一部分超时。例如,位于expressjs应用程序(如nginx之类的Web服务器或最终用户的Web浏览器)之前的服务最终将放弃等待连接关闭的响应。
我将需要深入研究已完成的代码库(或让某人向我解释:)),以了解在这种情况下Morgan将从已完成的内容中获得什么以及它将如何处理这些信息,但是我认为响应超时与您共享的信息一致。
关于express - Morgan不在日志中显示响应时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40892334/