Restify - 从模块访问记录器的最佳实践

Restify - Best practice for accessing logger from a module

我已经寻找了一段时间的答案,但一直没有找到解决方案。我知道我可以从 req.log.xxxxx(...) 访问内置记录器,但是我的控制器需要一个模块怎么办?例如:

在我的控制器文件中,someController.js

var myModule = require('myModule');

SomeController.listUsers = function listUsers(req, res, next){
    req.log.info('Some log message'); // <---- this works just fine
    //... 
}

在myModule.js中:

module.exports = {
    getUsers: function () {
        // ...
        // I would like to be able to log from here, but don't have access to the req object.
    }
}

我不太喜欢将日志对象传递给模块方法的想法,因为这对我来说似乎很草率。如果这是唯一的解决方案,那么我会接受它。

这里没有太多选择。通常我会传递 "req" 对象。另一种解决方法是使用 "this" 参数作为上下文。像这样:

function listUsers(req, res, next) {
    req.log.info('Some log message');
    myModule.getUsers.call({log: req.log});
}

和...

module.exports = {
    getUsers: function () {
        (this.log || logger.log)() // ...
    }
}

Restify 使用 bunyan 提供日志记录。

查看 documentation,用于 req.log 的记录器是在服务器启动时创建的记录器(或至少是该记录器的子项)。由于您还可以创建自己的记录器实例,因此我认为这应该可行:

// logger.js
var bunyan = require('bunyan');
module.exports = bunyan.createLogger(...);

// app.js
var server = restify.createServer({
  log : require('./logger')
});

// someController.js
var logger = require('./logger');
...

这在 Restify 服务器和应用程序的其他部分之间共享同一个记录器。如果您不一定要求记录器相同,您也可以在 someController.js.

中创建一个新的 Bunyan 实例

通常,记录器需要进入模块,在中间件或自定义错误对象中实现。

您在活动中的另一个选择。 Node.js 是一种事件驱动语言。您可以只创建一个记录器模块来侦听日志事件。这就是所谓的整洁编程。

但是,我会选择要求我的记录器进入文件,这样当我们进入 prod 时,我将它 deactivated/replaced 与另一个具有确切接口的更具体的记录器对象一起使用。