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

Node.js中Winston错误日志重复出现在警告日志文件的问题如何解决?

解决Winston错误日志同时写入多个文件的问题

问题原因

Winston的日志级别默认遵循递进规则:error > warn > info > verbose > debug > silly。当给某个transport设置level: "info"时,它会记录info级别及所有更高优先级的日志(包括warn、error),这就是error日志同时出现在logsWarnings.log和logsErrors.log的核心原因。


解决方案

方法一:使用format.filter过滤指定级别日志

给每个transport单独添加过滤规则,只保留对应级别的日志,是最直接的解决方式:

修改Winston配置代码如下:

const { createLogger, format, transports } = require("winston");
const { timestamp, printf, errors, filter } = format;

const logFormat = printf(({ level, message, timestamp, stack }) => {
  return `${timestamp} ${level}: ${stack || message}`;
});

const logger = createLogger({
  transports: [
    new transports.File({
      level: "info",
      filename: "logsWarnings.log",
      // 仅保留info级别的日志
      format: format.combine(
        filter((info) => info.level === "info"),
        timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
        format.json(),
        format.prettyPrint(),
        errors({ stack: true })
      )
    }),
    new transports.File({
      level: "error",
      filename: "logsErrors.log",
      // 仅保留error级别的日志
      format: format.combine(
        filter((info) => info.level === "error"),
        timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
        format.json(),
        format.prettyPrint(),
        errors({ stack: true })
      )
    }),
  ],
  statusLevels: true,
});

module.exports = logger;

方法二:自定义独立日志级别(可选)

如果需要完全独立的级别规则,可以自定义Winston的日志级别,让每个级别权重独立,避免递进记录:

const { createLogger, format, transports } = require("winston");
const { timestamp, printf, errors } = format;

const logFormat = printf(({ level, message, timestamp, stack }) => {
  return `${timestamp} ${level}: ${stack || message}`;
});

const logger = createLogger({
  // 自定义级别,每个级别权重独立,无递进关系
  levels: {
    info: 0,
    error: 1
  },
  transports: [
    new transports.File({
      level: "info",
      filename: "logsWarnings.log",
    }),
    new transports.File({
      level: "error",
      filename: "logsErrors.log",
    }),
  ],
  format: format.combine(
    timestamp({ format: "YYYY-MM-DD HH:mm:ss" }),
    format.json(),
    format.prettyPrint(),
    errors({ stack: true })
  ),
  statusLevels: true,
});

module.exports = logger;

验证

修改完成后,调用logger.info()和logger.error()分别生成日志,检查两个文件:

  • logsWarnings.log仅包含info级别的日志
  • logsErrors.log仅包含error级别的日志

内容的提问来源于stack exchange,提问作者node101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:18:27