摩根没有在日志

时间:2016-11-30 15:37:42

标签: express coffeescript morgan

我正在尝试使用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

为什么摩根未能显示响应时间,我该如何解决?

1 个答案:

答案 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写-而不是响应时间:

  1. 基于the source code,当Morgan找不到“启动计时器”时设置的临时变量时,它会向日志中写入-,因此写入{{ 1}}表示值或多或少为“ null”。

  2. 如果请求“从未”完成处理,即,如果请求超时而没有完成有效的响应,则摩根还将-写入日志。 (在这种情况下,我猜-或多或少表示“无穷大”。)

  3. Morgan 可能在值实际为0时也会写-,这可能解释了为什么移动{{ 1}}代码位于您的实际路线下方。或者,由于在第二种情况下Morgan调用-时可能已经处理了响应,所以可能会在写入临时开始时间变量之前立即触发完成的回调,从而导致#1。 / p>

为什么摩根有时候会在您的原始设置中写成-

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

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