9

我为 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 配置日志级别?

4

2 回答 2

7

好吧,我建议根本不包括温斯顿。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 是一个很好的例子(虽然你并不需要 configure 方法,这只是花里胡哨):

以下是覆盖 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

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

于 2014-04-04T16:20:37.313 回答
1

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

于 2014-04-24T21:35:37.363 回答