最佳实践使用户将记录器注入NodeJS模块



我为nodejs编写了此模块,该模块可用于通过sockjs向客户端派遣事件。

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

目前,我正在将Winston添加为依赖项,要求它作为每个类中的记录器,并使用Logger.Error,Logger.warn,...

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

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

现在,如何使记录器可以用自定义记录器替换或使用户从模块外部配置日志级别?

当然,他们不必触摸模块代码来更改记录器,但能够使用loglevel创建记录器,如果有的话,我的模块应使用它。

关于如何执行此操作的任何接收者?

或对" winston"的硬依赖性确定,并且可以通过NPM-CONFIG配置日志级别?

好吧,我建议根本不包括温斯顿。Winston有点巨大,并且包含了您的用户可能无法使用的许多不错的功能,我相信您的模块应该足够小,以至于用户将始终使用所有功能。如果有这样的情况,他们不想使用内置的记录仪,那么我想它还不够小。话虽如此,在需要调试时,一个模块记录内容很有帮助。

如果您想使用模块使用日志调试模块的开发人员有办法,那么我建议您拥有一个可以打开/关闭的调试模式。

您可以使用这样的东西来帮助您: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();

然后在您的模块中您将有一个默认记录器,该记录器可以如上图所示。

socket.io是它如何完成的一个很好的例子(尽管您真的不需要配置方法,那只是铃铛和哨子):

这是您将如何覆盖socket.io默认记录器:https://github.com/learnboost/socket.io/wiki/configuring-socket.io

以这种方式实现记录器:https://github.com/learnboost/socket.io/blob/0.9.14/lib/logger.js

如果出现问题,请尝试丢弃错误,或发出"错误"事件或使用错误调用回调(以适用的方式执行)。默默记录它,不是一个好主意。如果要报告它,请让用户代码处理它。也许是期望的(您不知道人们使用模块的疯狂方式!)。

尽管Winston是使用的第一原木机,但也有Bunyan,也被广泛采用。因此,是的,您应该将选择留给用户,并让他/她将记录仪注入您的模块中。Elasticsearch客户端模块很好地解决了这一点。您可以以相同的方式进行。

最新更新