让用户将记录器注入nodejs模块的最佳实践

时间:2014-03-11 20:12:57

标签: node.js logging dependency-injection winston

我为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")

现在,如何让记录器可以被自定义记录器替换,或者让用户从我的模块OUTSIDE配置日志级别?

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

关于如何做到这一点的任何建议?

或者是对温斯顿"好的,可以通过npm-config配置日志级别吗?

2 个答案:

答案 0 :(得分:4)

我建议不要包括温斯顿。 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

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

答案 1 :(得分:1)

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