fal*_*lla 4 javascript logging node.js express morgan
Morgan的文档描述了可以拆分请求和响应的日志记录:
分割/双重记录
该
morgan中间件可被用作根据需要许多时间,使得喜欢的组合:
- 根据请求记录日志,根据响应记录日志
- 将所有请求记录到文件,但将错误记录到控制台
在它们唯一的相关示例中,有一些注释描述了一个中间件将错误响应记录到控制台,而另一个请求记录到文件:
Run Code Online (Sandbox Code Playgroud)// 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());
}
}
});
Run Code Online (Sandbox Code Playgroud)
那么,如何正确地将请求记录在morgan中间件调用中,并将响应记录在另一个中间件中?
我设法通过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());
}
}
}));
Run Code Online (Sandbox Code Playgroud)
可以将它们分开,并以正确的顺序登录:
// 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());
}
}
}));
Run Code Online (Sandbox Code Playgroud)
注意:由于express只是增强了Node自身的请求和响应对象,因此我认为res.on('finish', req => { /* log stuff */ })在未将其设置为时,它会在内部进行增强immediate。
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |