You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:10:34