Javascript Expressjs动态格式化日志

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在运行时仅

试图在应用程序运行时更改morgan日志的格式

该值将根据数据库中的某个远程值进行更改,因此我希望morgan的输出发生更改。 即,如果数据库中的值为1,morgan的格式为“dev”,如果值为3,则格式为“组合”

我一直在使用以下行设置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);