node.js - 让用户将记录器注入(inject) nodejs 模块的最佳实践

标签 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")

现在,我怎样才能让记录器可以被自定义记录器替换,或者让用户从我的模块外部配置日志级别?

他们当然不必触及模块代码来更改记录器,但能够创建具有日志级别的记录器,并且我的模块应该使用它(如果可用)。

关于如何做到这一点有什么建议吗?

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

最佳答案

好吧,我建议根本不要包括 Winston。 Winston 有点大,包含许多您的用户可能不会使用的不错的功能,而且我相信您的模块应该足够小,以便用户始终使用它的所有功能。如果存在他们不想使用内置记录器的情况,那么我猜它还不够小。话虽如此,在需要调试时记录模块内容很有用。

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

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

如果用户想要集成他们自己的日志系统,我建议你有一种方法,他们可以向你的模块传递一个日志功能。像这样的东西(让我们称你的模块为 rock-the-sock:

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

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

关于node.js - 让用户将记录器注入(inject) nodejs 模块的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22335644/

相关文章:

javascript - NodeJS Express 在重定向期间传递值

node.js - 如何向node.js服务器发送消息?

javascript - 正则表达式匹配上的Nodejs Socket io

c++ - 如何在C++中记录用户定义的POD结构

java - 如果 log4j jar 在 webApp 的库中,Log4jConfigListener 不工作

logging - 如何访问第一次尝试的 yarn 日志?

ios - 如何在 Storyboard管理的 UIViewControllers 中依赖注入(inject)?

node.js - Grunt-mocha-test Xunit 报告器将整个控制台输出写入 xunit 文件

c# - Ninject Providers -> 在提供者中获取另一个依赖项

javascript - 使用 require.js 和 testr.js 启动并运行