Expressjs Morgan动态格式化日志

时间:2014-07-25 17:50:42

标签: javascript node.js logging express

尝试在应用程序运行时更改摩根的日志记录格式。

值将在数据库中的某个远程值上更改,我希望morgan的输出会因此而改变。 即。如果在数据库中值为1,则morgan的格式为'dev',如果值为3,则格式为'combined'

我一直在使用以下行来设置morgan格式:

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

其中get_verbose将对应于格式选项。 然而,它没有给出我想要的动态结果 - 它只设置格式一次。

我是否正确地解决了这个问题,或者在运行时仅限于1种格式?

2 个答案:

答案 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选项指定具有参数reqres的函数,该函数返回True/False以确定是否应跳过日志记录选项。只要函数返回TrueFalse,该函数就可以包含任何必要的代码。

根据您要区分登录的参数,这可能比多行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