如何同时使用 express-winston 和 winston-mongodb?

How to use express-winston and winston-mongodb together?

我正在使用 express-winston and winston-mongodb 将快速请求记录到 mongodb。

express-winston 配置:

expressWinston.logger({
  meta: true,
  //...other unrelated config
})

winston-mongo数据库配置:

new MongoDB({
  //...other unrelated config
})

登录 mongodb 有效,但 meta 字段为空。 登录 file/console 完美。

mongo 插件无法识别 express 插件的日志格式。

我怎样才能让他们玩得开心?

当您查看 express-winston 和 winston-mongodb 代码时,您可以很容易地看出区别。 winston-mongodb 将匹配 metaKey 字段的值写入指定集合。 所以,如果你这样定义,meta字段就不会为null。

...
transports: [
    new winston.transports.Console({
        format: winston.format.json({
            space: 2
        })
    }),
    new winston.transports.MongoDB({
        db: config.db.mongooseURI,
        options: config.db.options,
        collection:'logs',
        capped:true,
        metaKey:'meta'
    }),


],
meta: true,
...

这就是最终对我有用的:v6.12.1 稍后注意到,虽然这适用于数据库日志记录,但元数据对于文件传输是空的。不知道为什么。

 const winston = require('winston');     
 module.exports = function(err, req, res, next) {
 winston.error(err.message, {metadata: { prop: err } });
 res.status(500).send('Something failed.');
 };

如果您想登录到文件并 MongoDB 那么:

winston.add(
  new winston.transports.MongoDB({
    db: process.env.CONNECTIONSTRING,
    options: { useUnifiedTopology: true },
    metaKey: 'meta'
  })
)

module.exports = function (err, req, res, next) {
  // Log the exception
  winston.error({message: err.message, level: err.level, stack: err.stack, meta: err})

  res.status(500).send("Something failed..Cannot connect to Server");
};