我正在尝试使用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')
行,但是在错误捕获路由之前。放在那里,摩根将显示长期请求的状态代码和大小,与以前不同,但现在所有请求都没有显示它花费的时间;
GET / api / collab / dataobjects / 1 200 - ms - 4119
为什么摩根未能显示响应时间,我该如何解决?
答案 0 :(得分:0)
我刚刚注意到这个问题已经2岁多了,但是我已经做完了工作,所以无论如何我都会发表答复。
我自己也遇到过类似的问题,因此我花了一些时间来研究一下以解决这个问题。我不确定我是否能完全回答您的问题(还好吗?),但是我可以解释您所看到的一些事情:
启动计时器:
调用中间件处理程序方法(带有(req, res, next)
签名的方法)时,Morgan 启动其计时器,因此,在这种情况下:
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不会将行写到日志中,使用on-finished模块可以在快递请求处理已完成。
报告-
代替响应时间
我认为在某些情况下会导致Morgan写-
而不是响应时间:
基于the source code,当Morgan找不到“启动计时器”时设置的临时变量时,它会向日志中写入-
,因此写入{{ 1}}表示值或多或少为“ null”。
如果请求“从未”完成处理,即,如果请求超时而没有完成有效的响应,则摩根还将-
写入日志。 (在这种情况下,我猜-
或多或少表示“无穷大”。)
Morgan 可能在值实际为0时也会写-
,这可能解释了为什么移动{{ 1}}代码位于您的实际路线下方。或者,由于在第二种情况下Morgan调用-
时可能已经处理了响应,所以可能会在写入临时开始时间变量之前立即触发完成的回调,从而导致#1。 / p>
为什么摩根有时候会在您的原始设置中写成-
?
我认为最可能的情况是,您的“长期运行”请求正在根据基础结构的一部分或另一部分超时。例如,位于您的expressjs应用程序(如nginx之类的Web服务器或最终用户的Web浏览器)之前的服务最终将放弃等待连接关闭的响应。
我需要深入研究已完成的代码库(或让某人向我解释:)),以了解在这种情况下Morgan将从已完成的内容中得到什么以及它将如何处理这些信息,但是我认为响应超时与您共享的信息一致。