尝试在应用程序运行时更改摩根的日志记录格式。
值将在数据库中的某个远程值上更改,我希望morgan的输出会因此而改变。 即。如果在数据库中值为1,则morgan的格式为'dev',如果值为3,则格式为'combined'
我一直在使用以下行来设置morgan格式:
app.use(morgan(get_verbose()))
.use ....
其中get_verbose将对应于格式选项。 然而,它没有给出我想要的动态结果 - 它只设置格式一次。
我是否正确地解决了这个问题,或者在运行时仅限于1种格式?
答案 0 :(得分:2)
一种方法是创建一个“包装”摩根中间件的中间件功能:
var morganDev = mordan('dev');
var morganCombined = morgan('combined');
app.use(function(req, res, next) {
var value = /* get value somehow */
if (value === 1) {
morganDev(req, res, next);
} else if (value === 3) {
morganCombined(req, res, next);
}
});
在前面,您可以为每个日志格式创建一个记录器,但不要将它们中的任何一个附加到应用程序。取而代之的是,自定义函数会读取值并选择哪个记录器应该处理此请求的处理。
安全更新:应该有一个全能else
块来处理value
既不是1或3的情况。此块应调用{{1}直接,否则请求处理将停止并且永远不会向客户端返回响应。
答案 1 :(得分:1)
使用Morgan的内置功能实现此目的的另一种方法是skip
参数。来自documentation:
// EXAMPLE: only log error responses
morgan('combined', {
skip: function (req, res) { return res.statusCode < 400 }
})
skip
选项指定具有参数req
和res
的函数,该函数返回True/False
以确定是否应跳过日志记录选项。只要函数返回True
或False
,该函数就可以包含任何必要的代码。
根据您要区分登录的参数,这可能比多行if / else块更简单。与HTTP流量分开记录HTTPS流量的示例服务器:
const express = require('express');
const http = require('http');
const https = require('https');
const logger = require('morgan');
const httpsOptions = // {} hash of options.
app.use(logger('combined', {
stream: httpLogStream,
skip: function(req, res) { return req.secure }
});
app.use(logger('combined', {
stream: httpsLogStream,
skip: function(req, res) { return !req.secure }
});
http.createServer(app).listen(80);
https.createServer(httpsOptions, app).listen(443);
可以找到我在此示例中设置HTTPS的一个很好的步骤here。
阅读Express的req.secure
方法:here。
日志流设置为Morgan's documentation。