在 Node 中记录所有请求。js/Express
Logging all requests in Node.js/Express
在我的小型 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());
};
不幸的是,我只在出现错误时通过 app.logger.info
行获取日志(在我的例子中,正文中的 JSON 字符串格式错误)。我在这里错过了什么?
你可以使用 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);
}
Expressjs 根据您提供的回调类型调整其功能(这在 JS 库中并不常见,因此人们对此感到困惑也就不足为奇了)。
如果您在回调有四个参数的情况下执行此操作:
app.use(function(error, req, res, next) {...});
然后 Express 假定这是一个 error-only 中间件处理程序,并且只会在出现错误时调用。在 the express doc 中,请参阅标记为 Error-handling 中间件 的部分。请注意该页面的这个特定部分:
Define error-handling middleware functions in the same way as other
middleware functions, except with four arguments instead of three,
specifically with the signature (err, req, res, next)):
而且,这里有一整节文档专门用于 error handling middleware。
如果您只使用三个参数:
app.use(function(req, res, next) {...});
那么就是一个正常的中间件,在没有错误的情况下被调用。我不确定他们是否提供了一种同时获得两者的方法。但是,当然作为一种解决方法,您可以将日志记录代码放入一个函数中,然后从两个单独的中间件处理程序调用该函数,一个用于错误,一个用于 non-errors.
使用摩根https://github.com/expressjs/morgan
安装摩根
$ npm install morgan
在index.js或app.js或server.js文件中包含morgan(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!')
})
示例输出行如下所示:
::1 - - [31/May/2021:09:03:14 +0000] "GET / HTTP/1.1" 200 2078 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
DEBUG='*'
或 DEBUG='express:router'
环境变量
它并没有显示很多关于请求的信息,但它确实显示了路径和方法,这对于基本应用程序来说可能已经足够了,并且不需要任何额外的设置也很方便。
DEBUG='*'
启用所有日志并且输入稍微容易一些:
DEBUG='*' ./app.js
或更具体的 DEBUG='express:router'
是您在具有大量中间件的复杂应用程序中通常需要的,否则 DEBUG='*'
可能会产生堆积如山的输出:
DEBUG='express:router' ./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 上测试。
npm 安装正文解析器
npm 安装摩根体
并使用此代码段,
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}`)
})
在我的小型 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());
};
不幸的是,我只在出现错误时通过 app.logger.info
行获取日志(在我的例子中,正文中的 JSON 字符串格式错误)。我在这里错过了什么?
你可以使用 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);
}
Expressjs 根据您提供的回调类型调整其功能(这在 JS 库中并不常见,因此人们对此感到困惑也就不足为奇了)。
如果您在回调有四个参数的情况下执行此操作:
app.use(function(error, req, res, next) {...});
然后 Express 假定这是一个 error-only 中间件处理程序,并且只会在出现错误时调用。在 the express doc 中,请参阅标记为 Error-handling 中间件 的部分。请注意该页面的这个特定部分:
Define error-handling middleware functions in the same way as other middleware functions, except with four arguments instead of three, specifically with the signature (err, req, res, next)):
而且,这里有一整节文档专门用于 error handling middleware。
如果您只使用三个参数:
app.use(function(req, res, next) {...});
那么就是一个正常的中间件,在没有错误的情况下被调用。我不确定他们是否提供了一种同时获得两者的方法。但是,当然作为一种解决方法,您可以将日志记录代码放入一个函数中,然后从两个单独的中间件处理程序调用该函数,一个用于错误,一个用于 non-errors.
使用摩根https://github.com/expressjs/morgan
安装摩根
$ npm install morgan
在index.js或app.js或server.js文件中包含morgan(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!')
})
示例输出行如下所示:
::1 - - [31/May/2021:09:03:14 +0000] "GET / HTTP/1.1" 200 2078 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
DEBUG='*'
或 DEBUG='express:router'
环境变量
它并没有显示很多关于请求的信息,但它确实显示了路径和方法,这对于基本应用程序来说可能已经足够了,并且不需要任何额外的设置也很方便。
DEBUG='*'
启用所有日志并且输入稍微容易一些:
DEBUG='*' ./app.js
或更具体的 DEBUG='express:router'
是您在具有大量中间件的复杂应用程序中通常需要的,否则 DEBUG='*'
可能会产生堆积如山的输出:
DEBUG='express:router' ./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 上测试。
npm 安装正文解析器
npm 安装摩根体
并使用此代码段,
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}`)
})