我已经找了一段时间的答案,但还没有找到解决方案。我知道我可以从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.
}
}
我真的不喜欢将日志对象传递给模块的方法,因为这对我来说似乎很草率。如果这是唯一的解决方案,那么我会忍受它。
答案 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时,我将其取消激活/替换为具有确切界面的另一个更具体的记录器对象。