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 与另一个具有确切接口的更具体的记录器对象一起使用。
我已经寻找了一段时间的答案,但一直没有找到解决方案。我知道我可以从 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
.
通常,记录器需要进入模块,在中间件或自定义错误对象中实现。
您在活动中的另一个选择。 Node.js 是一种事件驱动语言。您可以只创建一个记录器模块来侦听日志事件。这就是所谓的整洁编程。
但是,我会选择要求我的记录器进入文件,这样当我们进入 prod 时,我将它 deactivated/replaced 与另一个具有确切接口的更具体的记录器对象一起使用。