0

console.log() をファイル (app_stdout.log) にリダイレクトしました 次に、プログラムを実行します。app_stdout.log ファイルが作成されています。ただし、プログラムの実行中にログ ファイルを手動で削除すると、app_stdout.log ファイルは再度作成されません。なんで?ここに何が欠けていますか?WriteStream からエラーをキャッチする方法はありますか?

var stdout = fs.createWriteStream("app_stdout.log", {flags: 'a'});

     process.__defineGetter__('stdout', function () {
          return stdout;
     });
4

1 に答える 1

1

少なくとも Unix では、ファイルを削除するとそのディレクトリ エントリが削除されますが、そのファイルを開いているプロセスは引き続きそのファイルに書き込むことができます (つまり、エラー状態ではありません)。

ログファイルを再オープン (/recreate) する必要があることをプロセスに知らせる一般的な方法は、シグナル (USR1たとえば、 (それの新しいインスタンス)。

以下を使用した簡単な PoC logstream:

var LogStream = require('logstream').LogStream;
var stdout    = new LogStream('/tmp/test.log');

process.__defineGetter__('stdout', function () {
  return stdout;
});

setInterval(function() {
  console.log(new Date().toString());
}, 1000);

process.on('SIGUSR1', function() {
  stdout.reopen();
});

または、ファイル システムからログファイルにアクセスできるかどうかを定期的に確認し、アクセスできない場合は再度開くこともできます。

于 2015-09-08T13:19:09.343 に答える