我想用模块构建Node.js应用程序。例如,我使用bunyan作为记录器。
我有一个文件main.js
//configs
var logfile = __dirname + '/log.txt';
//my own modules
var log = require("./modules/log"),
init = require("./modules/init");
因此,我正在将日志文件+路径传递到日志模块。
我的log.js
var bunyan = require('bunyan');
function init(logfile){
var log = bunyan.createLogger({
name: "myapp",
streams: [{
path: logfile
}]
});
return log;
};
module.exports.init = init;
而目前仅捕获未捕获异常的init.js:
var logging = require('./log'),
log = logging.init;
process.on('uncaughtException', function(err) {
//print to console
console.error((new Date).toUTCString() + ' uncaughtException:', err.message);
console.error(err.stack);
//print to bunyan logger
log.error((new Date).toUTCString() + ' uncaughtException:', err.message);
log.error(err.stack);
});
我现在的主要问题是我想在每个模块中使用记录器。但是当我这样做
var logging = require('./log'),
log = logging.init;
在每个文件中,那么它将每次创建记录器。我只想初始化一次,然后在每个模块中使用它。
我考虑过删除记录器的功能:
log.js
var bunyan = require('bunyan');
var log = bunyan.createLogger({
name: "juntidos",
streams: [{
path: logfile
}]
});
当我加载模块时,它只会被调用一次。但是,如何传递文件名参数呢?
因此,我正在将日志文件+路径传递到日志模块。
我看到你定义logfile
你以前require
的日志模块,但不同的JavaScript在浏览器中,Node.js的变量不是由默认的全局。
您的任何模块都不可见您的日志文件路径。
如果要(1)初始化记录器,以便可以在整个应用程序中使用它,并且(2)传递日志文件名,而不是将其硬编码到log.js
模块中,则一种方法是:
// log.js
var bunyan = require('bunyan');
module.exports = {
logger: undefined,
init: function(logfile) {
this.logger = bunyan.createLogger({
name: 'myapp',
streams: [{
path: logfile
}]
});
}
};
现在,您只需要确保init()
调用一次即可,并且确保在加载任何其他模块之前发生这种情况。那应该很容易:
// main.js
var logfile = __dirname + '/log.txt';
var log = require('./modules/log.js').init(logfile), // init() called here
anotherModule = require('./modules/anotherModule.js')
someOtherModule = require('./modules/someOtherModule.js');
在子模块中,执行以下操作:
// someOtherModule.js
var log = require('./log.js');
log.logger.warn('someOtherModule was loaded');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句