Node.js 将函数导出到不同文件中的多个调用者
我正在构建一个日志模块,它可以被位于不同文件中的多个调用者调用 我的目标是在程序开始时初始化日志文件,让调用者只调用一个函数,该函数记录到先前初始化的文件中,而不需要再次进行整个初始化 我不能完全掌握模块导出的概念,因此我希望您能提供帮助 实际日志记录发生在写入方法上。在主app.js文件中,我可以很好地启动和记录 然而,在另一个文件上,我有一个思维障碍,就是如何在不再次创建日志文件的情况下直接登录到该文件Node.js 将函数导出到不同文件中的多个调用者,node.js,Node.js,我正在构建一个日志模块,它可以被位于不同文件中的多个调用者调用 我的目标是在程序开始时初始化日志文件,让调用者只调用一个函数,该函数记录到先前初始化的文件中,而不需要再次进行整个初始化 我不能完全掌握模块导出的概念,因此我希望您能提供帮助 实际日志记录发生在写入方法上。在主app.js文件中,我可以很好地启动和记录 然而,在另一个文件上,我有一个思维障碍,就是如何在不再次创建日志文件的情况下直接登录到该文件 var fs = require('fs'); var fd = {}, log =
var fs = require('fs');
var fd = {},
log = {},
debug = false;
var tnlog = function(env, file, hostname, procname, pid) {
if (env == 'development')
debug = true;
fd = fs.createWriteStream(file, { flags: 'a', encoding: 'utf8', mode: 0644 });
log = { hostname: hostname, procname: procname, pid: pid };
};
tnlog.prototype.write = function(level, str) {
if (debug)
console.log(str);
else {
log.timestamp = Date.now();
log.level = level;
log.str = str;
fd.write(JSON.stringify(log) + '\n');
}
};
exports.tnlog = tnlog;
这是我初始化和登录主文件的方式:
var logfile = '/var/log/node/www/app.log';
var tnlog = require('./lib/tnlog').tnlog,
log = new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid);
如果你能提出更好的方法,我一定会非常感激。edit
最简单的解决办法是
var logfile = '/var/log/node/www/app.log';
var tnlog = require('./lib/tnlog').tnlog,
module.exports = new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid);
进入一个单独的文件(mylogger.js),并要求您在任何地方使用logger=require“/mylogger.js
”记录内容。您总是会返回tnlog
的单个实例,因为节点缓存导出的值
我还看到您可能正在使用Express,所以您也可以这样做
app.set(“logger”、新的tnlog(app.get('env')、日志文件、os.hostname()、appname、process.pid))
并使用app.get(“记录器”)
在任何有app
对象引用的地方检索它
古老的
更复杂的是:
您必须决定是否要在同一应用程序运行时支持记录到不同的文件。如果是这样,您绝对需要为每个日志文件创建一个对象。您不必导出构造函数本身,还可以导出工厂模式和单例模式之间的混合模式
您可以创建如下内容:
var loggers = {}
module.exports = function getLogger(env, file, hostname, procname, pid) {
key = env + file + hostname + procname + pid)
if(loggers[key]) return loggers[key]
return loggers[key] = new Logger(env, file, hostname, procname, pid)
}
也就是说,根据连接函数参数变量,检查是否已经创建了logger对象
当然,您需要创建一个合适的记录器构造函数,但我假设您了解一点Javascript
请注意,loggers
对象仍将是一个私有变量,就像Logger
构造函数一样。由于node.js缓存模块导出的对象,因此loggers
对象的值将作为getLogger
闭包的一部分,在多次调用require
时保持不变