自定义Transport中log函数未被调用问题求助
问题:自定义JsonDBTransport组件的
log函数未被调用? 我开发了一个自定义的Winston Transport组件(JsonDBTransport),但里面的log函数始终没有被触发调用。下面是相关的实现代码片段:
module.exports = { JsonDBTransport: class JsonDBTransport extends Transport { constructor(options) { super(options) if (options.level === "error") { this.logDBSystem = new Store({name: options.filename}) if (this.logDBSystem.get('log') === undefined) this.logDBSystem.set('log', []) } else { this.logDBUser = new Store({name: options.filename}) if (this.logDBUser.get('log') === undefined) this.logDBUser.set('log', []) } } log(info, callback) { let self = this setImmediate(function () { self.emit('...', // 代码不完整,但核心问题是log函数未被触发 } } } }
可能的原因及修复方案
1. 语法错误导致组件无法正常初始化
从你给出的代码片段能看到,log方法里的setImmediate回调没有闭合(缺少结束的括号和大括号),这种语法错误会直接导致整个Transport类初始化失败,log方法自然不可能被调用。先把语法问题修复:
log(info, callback) { let self = this; setImmediate(function () { self.emit('logged', info); // 示例:触发Winston要求的logged事件 if (callback) callback(null, true); // 告知Winston日志处理完成 }); }
2. 未正确实现Winston Transport的规范
Winston的自定义Transport需要严格遵循它的接口要求:
- 必须在
log方法末尾调用回调函数(如果传入的话),或者触发logged事件,否则Winston会认为日志处理失败,后续不再调用该Transport的log方法。 - 如果你使用的是Winston 3.x及以上版本,确认你继承的是
winston-transport包中的Transport类,而不是旧版的内部类。
3. 日志级别不匹配
检查你的Logger实例和Transport的级别配置是否兼容:
- 如果Logger的全局级别是
error,但Transport的级别设置为info,那么只有error级别的日志会被Logger过滤后传递给Transport,如果你只打了info级别的日志,Transport自然接收不到。 - 确保Transport构造函数中判断的
options.level和你实例化Transport时传入的level一致。
4. 未正确注册Transport到Winston Logger
确认你在创建Logger实例时,正确添加了这个自定义Transport:
const winston = require('winston'); const { JsonDBTransport } = require('./your-transport-file'); const logger = winston.createLogger({ level: 'info', transports: [ new JsonDBTransport({ filename: 'user-logs.db', level: 'info' // 这里的级别要和Transport构造函数中的判断逻辑对应 }) ] }); // 测试日志是否触发 logger.info('测试自定义Transport');
内容的提问来源于stack exchange,提问作者miyakoj
相关产品推荐
相关产品推荐

