使用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
相关产品推荐
相关产品推荐

