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

时间:2015-12-16 20:29:47

标签: node.js restify bunyan

我已经找了一段时间的答案,但还没有找到解决方案。我知道我可以从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.
    }
}

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

3 个答案:

答案 0 :(得分:1)

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实例。

答案 1 :(得分:0)

这里没有太多选择。通常我传递“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)() // ...
    }
}

答案 2 :(得分:0)

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

您在活动中拥有的另一个选项。 Node.js是一种事件驱动语言。您可以创建一个侦听日志事件的记录器模块。这称为整洁的编程。

但是,我选择要求我的记录器进入文件,因此当我们进入prod时,我将其取消激活/替换为具有确切界面的另一个更具体的记录器对象。

相关问题