【问题标题】:Morgan not displaying the response time in log摩根未在日志中显示响应时间
【发布时间】:2023-03-29 05:12:01
【问题描述】:

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

在检查了一些时间后,很明显,摩根在这些响应实际返回之前就记录了它们。为了解决这个问题,我将app.use logger('dev') 行移到了 api 路由之后,但在错误捕获路由之前。放在那里,Morgan 将显示长请求的状态代码和大小,与以前不同,但现在在所有请求上它都不会显示它所花费的时间;

GET /api/collab/dataobjects/1 200 - ms - 4119

为什么 Morgan 没有显示响应时间,我该如何解决?

【问题讨论】:

    标签: express coffeescript morgan


    【解决方案1】:

    我刚刚注意到这个问题已经 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 不会在响应完全处理之前将行写入日志,使用on-finished 模块在快速请求处理时得到回调完成了。

    报告-而不是响应时间

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

      1234563 value 或多或少是“null”。
    1. 如果请求“从未”完成处理,Morgan 还会将 - 写入日志 - 即,如果请求在未完成有效响应的情况下超时。 (在这种情况下,我猜- 或多或少表示“无穷大”)。

    2. Morgan 可能当值实际上是 0 时也会写 -,这也许可以解释为什么在您将 app.use(logger) 代码移到您的下方后,您开始一直看到 -实际路线。或者,由于在第二个场景中 Morgan 调用 onFinished 时响应可能已经处理完毕,因此可能在写入临时开始时间变量之前立即触发 on-finished 回调,从而导致 #1。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 1970-01-01
      • 2020-09-14
      • 2019-09-01
      • 2021-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多