【问题标题】:How to properly split logging between requests and responses with Morgan?如何使用 Morgan 在请求和响应之间正确拆分日志记录?
【发布时间】:2018-06-25 05:55:06
【问题描述】:

Morgan's documentation 描述了可以拆分请求和响应的日志记录:

拆分/双重记录

morgan 中间件可以根据需要多次使用,实现如下组合:

  • 在请求时记录条目,在响应时记录条目
  • 将所有请求记录到文件,但将错误记录到控制台

在他们唯一相关的例子中,有一些 cmets 描述了一个中间件将错误响应记录到控制台,另一个请求记录到文件:

// log only 4xx and 5xx responses to console
app.use(morgan('dev', {
  skip: function (req, res) { return res.statusCode < 400 }
}))

// log all requests to access.log
app.use(morgan('common', {
  stream: fs.createWriteStream(path.join(__dirname, 'access.log'), {flags: 'a'})
}))

这似乎实现了将所有请求记录到文件并将错误记录到控制台的第二个示例,但不是第一个。

我有点迷茫,我不明白是什么告诉morgan 只记录请求或只记录响应。我是否必须关心将这些中间件正确放置在哪里?

目前,我猜我对请求和响应都有一个日志条目:

morgan('[:date[clf]] :remote-addr :url :method HTTP/:http-version :status :remote-user :res[content-length] :referrer :user-agent :response-time ms', {
  stream: {
    write: (message) => {
      winston.silly(message.trim());
    }
  }
});

那么,我怎样才能在morgan 中间件调用中正确记录请求,而在另一个调用中响应

【问题讨论】:

    标签: javascript node.js express logging morgan


    【解决方案1】:

    我已经设法使用 immediate 选项在请求和响应之间拆分 Morgan 日志记录:

    立即

    根据请求而不是响应写入日志行。这意味着即使服务器崩溃也会记录请求,但无法记录来自响应的数据(如响应代码、内容长度等)。

    所以,不要使用这种混合日志记录:

    app.use(morgan(':remote-addr :url :method HTTP/:http-version :status :res[content-length] :user-agent :response-time ms', {
      stream: {
        write: (message) => {
          winston.info(message.trim());
        }
      }
    }));
    

    可以将它们分开,并以正确的顺序登录:

    // Logs requests
    app.use(morgan(':remote-addr :url :method HTTP/:http-version :user-agent', {
      // https://github.com/expressjs/morgan#immediate
      immediate: true,
      stream: {
        write: (message) => {
          winston.info(message.trim());
        }
      }
    }));
    
    // Logs responses
    app.use(morgan(':remote-addr :url :method :status :res[content-length] :response-time ms', {
      stream: {
        write: (message) => {
          winston.info(message.trim());
        }
      }
    }));
    

    注意:由于express just enhances Node's own request and response objects,我相信它在内部会执行res.on('finish', req =&gt; { /* log stuff */ }),当它没有设置为immediate时。

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 2017-10-13
      • 2017-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2018-12-20
      • 1970-01-01
      相关资源
      最近更新 更多