我正在尝试使用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编写-而不是响应时间:
  • 基于the source code,当Morgan找不到“启动计时器”时设置的临时变量时,Morgan会将-写入日志,因此编写-表示该值或多或少为“null”。
  • 如果请求“从未”完成处理,即请求未完成有效响应而超时,则
  • Morgan还将-写入日志。 (在这种情况下,我猜-或多或少表示“无穷大”)。
  • 当值的字面值为0时,Morgan也可能会写-,这也许可以解释为什么将-代码移到实际路线下方后,总是一直看到app.use(logger)。或者,由于在第二种情况下Morgan调用onFinished时可能已经处理了响应,所以可能在写入临时开始时间变量之前立即触发完成的回调,从而导致#1。

  • 为什么MORGAN有时会在您的原始设置中写-

    我认为最可能的情况是,您的“长期运行”请求正在根据基础结构的一部分或另一部分超时。例如,位于expressjs应用程序(如nginx之类的Web服务器或最终用户的Web浏览器)之前的服务最终将放弃等待连接关闭的响应。

    我将需要深入研究已完成的代码库(或让某人向我解释:)),以了解在这种情况下Morgan将从已完成的内容中获得什么以及它将如何处理这些信息,但是我认为响应超时与您共享的信息一致。

    关于express - Morgan不在日志中显示响应时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40892334/

    10-09 21:46