Winston日志写入MongoDB异常:error级日志重复存入双集合修复
修复Winston结合MongoDB时Error日志重复存储问题
问题根源
Winston的日志级别是层级递进的:当为transport设置level: "info"时,它会捕获info及所有更高级别的日志(包括warn、error等)。这就是error日志会同时存入infoLog和errorLog两个集合的核心原因。
解决方案
给infoLog对应的MongoDB transport添加级别过滤规则,强制只写入info级别的日志,排除其他级别日志。
修改后的完整代码
const { createLogger, format, transports } = require("winston"); require("dotenv").config(); require("winston-mongodb"); const logger = createLogger({ format: format.combine( format.timestamp({ format: "DD-MM-YYYY HH:mm:ss Z ", }), format.json(), format.metadata() ), transports: [ new transports.Console(), // 仅存储info级别日志到infoLog集合 new transports.MongoDB({ level: "info", db: "mongodb://localhost:27017/oos", options: { useUnifiedTopology: true, }, collection: "infoLog", // 添加过滤:只保留level为info的日志 format: format.combine( format.filter(info => info.level === "info") ) }), // 存储error级别日志到errorLog集合 new transports.MongoDB({ level: "error", db: "mongodb://localhost:27017/oos", options: { useUnifiedTopology: true, }, collection: "errorLog", }), ], }); module.exports = logger;
验证效果
- 调用
logger.error(...)时,日志仅写入errorLog集合,不会出现在infoLog中。 - 调用
logger.info(...)时,日志仅写入infoLog集合。
内容的提问来源于stack exchange,提问作者kick
相关产品推荐
相关产品推荐

