我为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 回答
好吧,我建议不要包括温斯顿 . Winston有点大,并且包含许多用户可能不会使用的很好的功能,我相信您的模块应该足够小,用户将始终使用它的所有功能 . 如果有一种情况他们不想使用内置 Logger ,那么我认为它不够小 . 话虽如此,在调试需要时记录模块的模块很有帮助 .
如果您想让开发人员使用您的模块使用日志调试模块,那么我建议您使用可以打开/关闭的调试模式 .
你可以使用这样的东西来帮助你:https://www.npmjs.org/package/debug
如果用户想要集成他们自己的日志系统,我建议你有办法让他们可以通过你的模块记录功能 . 这样的事情(让我们把你的模块称为摇滚袜子:
然后在您的模块中,您将拥有一个默认 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
如果出现问题,请尝试抛出错误,或发出“错误”事件或使用错误调用回调(执行适用的任何操作) . 默默地记录它,不是一个好主意 . 如果您要报告它,那么让用户代码处理它 . 也许错误是预期的(你不知道人们使用你的模块的疯狂方式!) .
虽然winston是使用的头号 Logger ,但也有bunyan,它也被广泛采用 . 所以是的,您应该将选择留给用户并让他/她将 Logger 注入您的模块 . Elasticsearch客户端模块很好地解决了这个问题 . 你可以做到the same way .