如何在Winston中配置多个互斥自定义日志级别?
实现Winston多Transport的互斥日志级别配置
当然可以实现这种精确的日志级别隔离!Winston本身提供了几种灵活的方式来控制不同Transport只记录特定的日志级别,甚至完全互斥的级别。下面我会分享两种常用的实战方案:
方案一:使用Format过滤器(最直观灵活)
这种方法不需要改动Winston默认的级别体系,直接给每个Transport添加一个过滤器格式,只允许指定级别的日志通过。这是实现互斥级别最直接的方式:
const winston = require('winston'); const { format } = winston; // 创建基础Logger const logger = winston.createLogger({ format: format.combine( format.timestamp(), // 可选:添加时间戳 format.json() ) }); // 仅记录error级别的Transport(写入errors.log) logger.add(new winston.transports.File({ filename: 'errors.log', format: format.combine( // 只允许error级别通过 format.filter(info => info.level === 'error'), format.json() ) })); // 仅记录info级别的Transport(不包含error,写入info.log) logger.add(new winston.transports.File({ filename: 'info.log', format: format.combine( // 只允许info级别通过 format.filter(info => info.level === 'info'), format.json() ) }));
测试验证:
logger.error('数据库连接失败'); // 仅出现在errors.log中 logger.info('用户登录成功'); // 仅出现在info.log中
如果需要更复杂的级别分组(比如一个Transport记录info和warn),只需调整filter的条件即可:
format.filter(info => ['info', 'warn'].includes(info.level))
方案二:自定义级别权重+Filter(适合优先级调整场景)
如果你需要重新规划日志级别的优先级,同时实现隔离,可以自定义级别权重,再配合Filter实现完全互斥。比如想让error作为最高优先级但仅在专属Transport记录,info作为次优先级且不包含error:
const winston = require('winston'); const { format } = winston; // 自定义级别权重:error权重最低(最严重),info次之 const customLevels = { levels: { error: 0, info: 1, warn: 2, debug: 3 } }; const logger = winston.createLogger({ levels: customLevels.levels, format: format.combine( format.timestamp(), format.json() ) }); // 仅记录error级别 logger.add(new winston.transports.File({ filename: 'errors.log', level: 'error' })); // 记录info及以下,但排除error logger.add(new winston.transports.File({ filename: 'info.log', level: 'info', format: format.combine( format.filter(info => info.level !== 'error'), format.json() ) }));
总结:如果只是需要简单的互斥级别记录,方案一的Filter Format是最推荐的,它不需要改动默认级别体系,代码清晰易维护。
内容的提问来源于stack exchange,提问作者Tommz
相关产品推荐
相关产品推荐

