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

