记录Node.js / Express中的所有请求

时间:2017-02-07 21:01:25

标签: json node.js express logging winston

在我的小node.js应用程序中,使用express,我想记录所有传入的请求,所以我最终得到了这个:

var bodyParser = require('body-parser');

module.exports = function(app) {
   app.set("port", 50001);
   app.set("json spaces", 2);
   app.use(bodyParser.json());
   app.use(function (error, req, res, next) {
      app.logger.info("received from "+req.get("X-Forwarded-For")+" : "+req.method+" "+req.originalUrl+" (Authorization: "+req.get("Authorization")+")");
      //does not work if json is malformed
      //app.logger.info("content :"+JSON.stringify(req.body));
      if (error /*instanceof SyntaxError*/) {
         res.status(400);
         app.logger.error(error);
         res.json({ error:{msg: error.message}});
      } else {
         next();
      }
   });
   app.use(app.auth.initialize());
};

不幸的是,当出现错误时(我的情况下是正文中格式错误的JSON字符串),我只通过app.logger.info行获取日志。我在这里缺少什么?

5 个答案:

答案 0 :(得分:14)

Expressjs根据你给它的回调类型来调整它的功能(这在JS库中并不常见,因此人们对它感到困惑并不奇怪。)

如果你这样做,你的回调有四个参数:

app.use(function(error, req, res, next) {...});

然后Express假设这是一个仅错误的中间件处理程序,只有在出现错误时才会调用。在the express doc中,请参阅标有 错误处理中间件 的部分。请注意该页面的特定部分:

  

以与其他方式相同的方式定义错误处理中间件功能   中间件函数,除了四个参数而不是三个,   特别是签名(err,req,res,next)):

而且,这里是专门讨论error handling middleware的文档的一部分。

如果你只使用三个参数:

app.use(function(req, res, next) {...});

然后,它是一个正常的中间件,在没有错误时调用。我不确定他们是否提供了一种方法来获得两者。但是,当然作为一种解决方法,您可以将您的日志代码放入一个函数中,然后从两个独立的中间件处理程序调用该函数,一个用于错误,一个用于非错误。

答案 1 :(得分:0)

使用摩根https://github.com/expressjs/morgan

安装摩根

$ npm install morgan

将morgan包含在index.js或app.js或server.js文件(package.json中的脚本标记指向的文件中)

var morgan = require('morgan')

然后在所有应用调用之前添加以下内容。

app.use(morgan('combined'))

完整示例

var express = require('express')
var morgan = require('morgan')

var app = express()

app.use(morgan('combined'))

app.get('/', function (req, res) {
  res.send('hello, world!')
})

答案 2 :(得分:0)

DEBUG='*' 环境变量

它没有显示很多信息,但它显示了路径和方法,这对于基本应用程序来说可能已经足够了,并且不需要任何额外设置,很方便:

DEBUG='*' ./app.js

例如与你好世界:

#!/usr/bin/env node

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

然后,当我使用不同的 URL 在浏览器上玩游戏时,我可以看到如下日志:

  express:router dispatching GET / +3m
  express:router query  : / +0ms
  express:router expressInit  : / +0ms
  express:router dispatching GET /asdf +10s
  express:router query  : /asdf +0ms
  express:router expressInit  : /asdf +0ms
  finalhandler default 404 +3m
  express:router dispatching GET /asdf?qwer=zxcv +17s
  express:router query  : /asdf?qwer=zxcv +0ms
  express:router expressInit  : /asdf?qwer=zxcv +0ms
  finalhandler default 404 +17s

文档位于:https://expressjs.com/en/guide/debugging.html

在 express 4.17.1 上测试。

答案 3 :(得分:0)

npm install body-parser

并使用此代码段,

const express = require('express')
const morganBody = require("morgan-body")
const bodyParser = require("body-parser")

const app = express()
const port = 8888

// must parse body before morganBody as body will be logged
app.use(bodyParser.json());

// hook morganBody to express app
morganBody(app, {logAllReqHeader:true, maxBodyLength:5000});

app.get('/', (req, res) => {
  res.send('Hello World!')

})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

答案 4 :(得分:-1)

你可以使用try / catch

try {
   var jsonBody = JSON.stringify(req.body);
   app.logger.info("content :" + jsonBody);
} catch (err) { 
    app.logger.error("content error, error type: invalid json, error msg:" + err);
}