Expressjs Morgandynamic格式化日志

尝试通过应用程序运行时更改摩根日志logging的格式。

该值将在一个数据库中的某个远程值更改悬而未决,我想摩根的输出作为结果改变。 即。 如果在数据库中的值是1摩根的格式是'dev',如果值是3格式是'组合'

我已经使用下面的行来设置摩根与格式:

app.use(morgan(get_verbose())) .use .... 

其中get_verbose将对应于格式选项。 然而,它并没有给我想要的dynamic结果 – 它只是设置格式一次。

我是否正确地处理这个问题,或者在运行时将摩尔森限制为只有一种格式?

一种方法是创build一个“包装”摩根中间件的中间件function:

 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); } }); 

在前面,你为每个日志格式创build一个logging器,但不要附加到应用程序中。 在他们的地方,自定义函数读取值并select哪个logging器应该处理这个请求的处理。

安全更新:应该有一个全能的块来处理value不是1或3的情况。这个块应该直接调用next() ,否则请求处理将停止,并且永远不会向客户端返回响应。

用Morgan的内置function来完成这个工作的另一个方法是skip参数。 从文档 :

 // EXAMPLE: only log error responses morgan('combined', { skip: function (req, res) { return res.statusCode < 400 } }) 

skip选项指定一个函数,其参数reqres返回True/False以确定是否应该跳过日志logging选项。 只要函数返回TrueFalse ,函数就可以包含任何必要的代码。

根据您想要区分login的参数,这可能是一个简单的方法,然后多行的if / else块。 HTTPSstream量与HTTPstream量分开logging的示例服务器:

 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); 

在这个例子中,我可以在这里find一个很好的设置HTTPS的步骤。

阅读Express的req.secure方法: 在这里 。

日志stream是根据Morgan的文档设置的 。