0

異なるファイルにある複数の呼び出し元から呼び出すことができるログ モジュールを構築しています。

私の目的は、プログラムの開始時にログ ファイルを初期化し、初期化全体を再度行わずに、以前に初期化されたファイルにログを記録する関数を呼び出し元に呼び出すことです。

モジュール エクスポートの概念がよくわからないので、お役に立てれば幸いです。

実際のロギングは、メソッドの書き込み時に発生します。メインの 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と同様に、オブジェクトはプライベート変数のままであることに注意してください。Loggernode.js は、モジュールがエクスポートするオブジェクトをキャッシュするため、オブジェクトの値は、クロージャの一部として、loggersへの複数の呼び出しにわたって保持されます。requiregetLogger

于 2013-05-04T16:29:50.437 に答える