摩根没有在日志中显示响应时间



我正在尝试使用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/collect/dataObjects/1/更新 - ms--

检查了一些时间后,很明显,摩根在实际返回之前正在记录这些回复。为了解决此问题,我在API路由后移动了app.use logger('dev')线,但是在捕获路线的错误之前。放置在那里,摩根将显示状态代码和长期请求的大小,但现在,根据所有请求,它并没有显示所花费的时间;

get/api/collect/dataObjects/1 200- MS -4119

为什么摩根无法显示响应时间,我该如何修复?

我刚刚注意到这个问题已经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方法运行后开始。

停止计时器:

摩根不会停止计时器在格式化要编写的日志线之前。

除非另有配置(例如,使用immediate选项),Morgan才能将响应完全处理到日志上,直到完全处理响应,然后使用固定的模块在完成Express请求处理完成时将其称为靠背。

报告-而不是响应时间

我认为有几种情况会导致摩根写-而不是响应时间:

  1. 基于源代码,看起来Morgan将在"启动计时器"时找不到设置的临时变量时,将-写入日志,因此编写-以表明该值更多或少" null"。

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

  3. Morgan 可能在值为0时还要编写-,这可能解释了为什么您在实际路线下方移动app.use(logger)代码后一直在看到-。另外,由于摩根在您的第二种情况下调用onFinished的时间可能已经处理了响应,因此可能立即(可能是在临时启动时间变量编写之前)立即进行的回调射击,从而导致#1。

    <。

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

我认为最有可能的情况是,您的"长期运行"请求是根据基础架构或另一部分的一部分进行计时。例如,位于ExpressJS应用程序前面的服务(Nginx或最终用户的Web浏览器)最终将放弃等待响应关闭连接的连接。

我需要在完成的代码库中进行挖掘(或者有人向我解释一下:)),以了解摩根在这种情况下会从中恢复过的东西,以及它将对这些信息做些什么,但是我认为响应超时与您共享的信息一致。

最新更新