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

使用Winston与Morgan搭建日志中间件时遇类型错误求助

Winston与Morgan配置错误排查与修复

错误原因

你遇到的TypeError: Cannot create property 'Symbol(level)' on string是因为Winston的logger.log()方法参数使用错误:

  • Morgan通过stream.write传递的message是完整的请求日志字符串(比如::1 GET /api/...)
  • 但Winston的logger.log()方法并不接受直接传入字符串,它需要的是「日志级别 + 消息内容」的组合参数,或者一个包含level和message属性的对象。直接传字符串会导致Winston内部尝试给字符串添加内置的level符号属性,从而触发类型错误。

修复方案

有两种简单的修复方式,任选其一即可:

方案一:使用Winston的级别方法(推荐)

直接调用Winston的级别方法(比如info),同时去除message末尾的换行符:

const stream = {
  write: (message) => logger.info(message.trim()),
};

方案二:使用logger.log()的正确参数格式

如果需要自定义日志级别,传入包含level和message的对象:

const stream = {
  write: (message) => logger.log({
    level: 'info', // 可根据需求调整为其他级别,比如'http'
    message: message.trim()
  }),
};

修复后的完整代码

const format = winston.format.combine(
  winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss:ms' }),
  winston.format.printf(
    (info) => `${info.timestamp} ${info.level}: ${info.message}`,
  ),
)

const transports = [
  new winston.transports.Console(),
  new winston.transports.File({
    filename: 'logs/error.log',
    level: 'error',
  }),
  new winston.transports.File({ filename: 'logs/all.log' }),
]

const logger = winston.createLogger({
  format,
  level: "info",
  transports
})

// 修复后的stream配置
const stream = {
  write: (message) => logger.info(message.trim()),
};

const morganMiddleware = morgan(
  ":remote-addr :method :url :status :res[content-length] - :response-time ms",
  { stream }
);

app.use(morganMiddleware);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:01:01