Javascript Expressjs动态格式化日志
试图在应用程序运行时更改morgan日志的格式 该值将根据数据库中的某个远程值进行更改,因此我希望morgan的输出发生更改。 即,如果数据库中的值为1,morgan的格式为“dev”,如果值为3,则格式为“组合” 我一直在使用以下行设置morgan的格式:Javascript Expressjs动态格式化日志,javascript,node.js,logging,express,Javascript,Node.js,Logging,Express,试图在应用程序运行时更改morgan日志的格式 该值将根据数据库中的某个远程值进行更改,因此我希望morgan的输出发生更改。 即,如果数据库中的值为1,morgan的格式为“dev”,如果值为3,则格式为“组合” 我一直在使用以下行设置morgan的格式: app.use(morgan(get_verbose())) .use .... 其中get_verbose将对应于格式选项。 然而,它并没有给出我所希望的动态结果——它只是设置了一次格式 我这样做是错误的还是morgan在运行时仅
app.use(morgan(get_verbose()))
.use ....
其中get_verbose将对应于格式选项。
然而,它并没有给出我所希望的动态结果——它只是设置了一次格式
我这样做是错误的还是morgan在运行时仅限于1种格式 一种方法是创建“包装”Morgan中间件的中间件功能:
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);
}
});
在前面,您可以为您想要的每种日志格式创建一个记录器,但不要将它们中的任何一个附加到应用程序。在它们的位置上,一个自定义函数读取该值并选择哪个记录器应该处理该请求
安全更新:应该有一个catch all
else
块来处理值既不是1也不是3的情况。此块应直接调用next()
,否则请求处理将暂停,并且永远不会向客户端返回响应。使用Morgan的内置功能实现此目的的另一种方法是skip
参数。从:
可以找到一个很好的设置HTTPS的演练,就像我在本例中所做的那样
阅读Express的req.secure
方法:
日志流的设置如中所示
// EXAMPLE: only log error responses
morgan('combined', {
skip: function (req, res) { return res.statusCode < 400 }
})
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);