0

我正在构建一个日志模块,可以由位于不同文件中的多个调用者调用。

我的目标是在程序开始时初始化日志文件,并让调用者只调用一个函数,该函数将记录到之前初始化的文件中,而无需再次进行整个初始化。

我不太了解模块导出的概念,因此希望您能提供帮助。

实际的日志记录发生在方法 write 上。在主 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);

如果您能提出更好的做事方式,我一定会很感激。

4

1 回答 1

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 构造函数,但我假设您了解一点 Javascript。

请注意,该loggers对象将保持为私有变量,就像Logger构造函数一样。因为 node.js 缓存了模块导出的对象,所以作为闭包的一部分,loggers对象的值将持续多次调用.requiregetLogger

于 2013-05-04T16:29:50.437 回答