0

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

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

4

3 回答 3

1

Restify 用于bunyan提供日志记录。

查看文档,用于的记录器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.

于 2015-12-16T20:41:53.310 回答
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)() // ...
    }
}
于 2015-12-16T20:35:02.777 回答
0

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

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

但是,我会选择将我的记录器放入文件中,这样当我们进入 prod 时,我会将其停用/替换为另一个具有确切接口的更具体的记录器对象。

于 2015-12-16T20:42:45.143 回答