我正在构建一个可以由位于不同文件中的多个呼叫者调用的日志记录模块。
我的目标是在程序开始时初始化日志文件,并让调用者只调用一个函数,该函数会记录到之前初始化的文件,而不会再次进行整个初始化。
我无法完全掌握模块出口的概念,因此我希望你能提供帮助。
实际记录发生在方法写入上。在主app.js文件中,我可以启动并正常登录。
然而,在另一个文件中,我对如何在不重新创建日志文件的情况下登录文件进行了一次心理障碍。
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);
如果你能提出一个更好的做事方式,我一定会很感激。
答案 0 :(得分:0)
最简单的解决方案是放
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",new tnlog(app.get('env'), logfile, os.hostname(), appname, process.pid))
并在app
对app.get("logger")
对象的引用的任何地方检索它。
更复杂:
您必须决定是否要在运行相同应用时支持记录到不同的文件。如果是这样,您绝对需要为每个日志文件创建一个对象。您不必导出构造函数本身,也可以在工厂和单例模式之间导出一种混合。
你会创建类似的东西:
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对象。
然后你需要创建一个合适的Logger构造函数,但我假设你知道一些Javascript。
请注意,loggers
对象将保留为私有变量,就像Logger
构造函数一样。因为node.js缓存模块导出的对象,所以loggers
对象的值将持续多次调用require
,作为getLogger
闭包的一部分。