首页 文章

让用户将 Logger 注入nodejs模块的最佳实践

提问于
浏览
5

我为nodejs编写了这个模块,可用于从任何地方通过sockjs向客户端分发事件 .

现在我想包括一些可配置的日志记录机制 .

目前,我正在添加winston作为依赖项,要求它作为每个类中的 Logger 并使用logger.error,logger.warn,...

#logger.js
var logger = require('winston');
module.exports=logger;

#myClass
var logger = require("./logger");
logger.error("Something went wrong")

现在,如何让 Logger 可以被自定义 Logger 替换,或者让用户从OUTSIDE my module配置日志级别?

他们当然不必触摸模块代码来更改 Logger ,但能够使用loglevel创建 Logger ,我的模块应该使用它(如果可用) .

有关如何做到这一点的任何推荐?

或者是对“winston”的硬依赖,并且可以通过npm-config配置日志级别吗?

2 回答

  • 1

    好吧,我建议不要包括温斯顿 . Winston有点大,并且包含许多用户可能不会使用的很好的功能,我相信您的模块应该足够小,用户将始终使用它的所有功能 . 如果有一种情况他们不想使用内置 Logger ,那么我认为它不够小 . 话虽如此,在调试需要时记录模块的模块很有帮助 .

    如果您想让开发人员使用您的模块使用日志调试模块,那么我建议您使用可以打开/关闭的调试模式 .

    你可以使用这样的东西来帮助你:https://www.npmjs.org/package/debug

    如果用户想要集成他们自己的日志系统,我建议你有办法让他们可以通过你的模块记录功能 . 这样的事情(让我们把你的模块称为摇滚袜子:

    var rockTheSock = require('rock-the-sock');
    var rockTheSock.logger = function (level, message, metadata) {
        console.log('level :', level, message, metadata); // TODO: Integrate winston
    };
    rockTheSock.startRocking();
    

    然后在您的模块中,您将拥有一个默认 Logger ,它可以覆盖如上所示 .

    socket.io是一个很好的例子,说明它是如何完成的(虽然你真的不需要配置方法,这只是钟声和口哨):

    以下是覆盖socket.io默认 Logger 的方法:https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO

    Logger 以这种方式实现的位置:https://github.com/LearnBoost/Socket.IO/blob/0.9.14/lib/logger.js

    如果出现问题,请尝试抛出错误,或发出“错误”事件或使用错误调用回调(执行适用的任何操作) . 默默地记录它,不是一个好主意 . 如果您要报告它,那么让用户代码处理它 . 也许错误是预期的(你不知道人们使用你的模块的疯狂方式!) .

  • 4

    虽然winston是使用的头号 Logger ,但也有bunyan,它也被广泛采用 . 所以是的,您应该将选择留给用户并让他/她将 Logger 注入您的模块 . Elasticsearch客户端模块很好地解决了这个问题 . 你可以做到the same way .

相关问题