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 上,删除文件会删除其目录条目,但任何打开文件的进程仍然可以写入它(换句话说,这不是错误条件)。

让进程知道它应该重新打开(/重新创建)日志文件的一种常用方法是向它发送一个信号(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 回答