Winston Logger能否返回其存储错误的MongoDB文档ObjectId?
获取Winston MongoDB日志文档的ObjectId
你遇到的undefined问题很典型——因为Winston的MongoDB日志操作是异步的,当你直接把logger.error()的返回值赋值给变量时,数据库插入操作还没完成,自然拿不到结果。下面是几种可行的解决办法:
方案一:用Promise/Async-Await获取插入结果(推荐)
较新的winston-mongodb版本(v5及以上)支持Promise返回,你可以通过异步语法拿到插入后的ObjectId:
const winston = require('winston'); const { MongoDB } = require('winston-mongodb'); const moment = require('moment'); // 初始化日志实例 const logger = winston.createLogger({ level: 'debug', format: winston.format.combine( winston.format.timestamp({ format: () => moment().format('YYYY-MM-DD hh:mm:ss') }), winston.format.json() ), transports: [ new winston.transports.Console(), new MongoDB({ db: 'mongodb://localhost:27017/your-database', collection: 'application_logs', options: { useNewUrlParser: true, useUnifiedTopology: true } }) ] }); // 用async/await调用日志方法 async function logAndGetId() { try { const insertResult = await logger.error('测试错误日志内容'); console.log('日志文档的ObjectId:', insertResult.insertedId); } catch (err) { console.error('日志插入失败:', err); } } logAndGetId();
方案二:回调函数兼容旧版本
如果你的winston-mongodb版本比较旧,不支持Promise,可以用回调函数获取结果:
logger.error('测试错误日志内容', (err, result) => { if (err) { console.error('日志写入失败:', err); } else { console.log('日志ObjectId:', result.insertedId); } });
方案三:自定义唯一ID(兜底方案)
要是以上方法都因为版本限制没法用,你可以自己生成唯一ID(比如用uuid库),把它作为自定义字段存入日志,同时自己留存这个ID:
const { v4: uuidv4 } = require('uuid'); async function logWithCustomId() { const customLogId = uuidv4(); // 把自定义ID加入日志元数据 await logger.error('测试错误日志内容', { customLogId }); console.log('自定义日志ID:', customLogId); // 之后可以用这个ID去MongoDB里查询对应日志 } logWithCustomId();
最后提醒下,尽量把winston和winston-mongodb升级到稳定的新版本,这样能避免很多旧版本的兼容性问题。
内容的提问来源于stack exchange,提问作者Prabhat Mishra
相关产品推荐
相关产品推荐

