将console.log()重定向到文件。如果手动删除日志文件,则不会再次创建日志文件

时间:2015-09-08 12:57:54

标签: node.js node.js-stream

我已将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;
     });

1 个答案:

答案 0 :(得分:1)

至少在Unix上,删除文件会删除其目录条目,但任何打开文件的进程仍然可以写入它(换句话说,它不是错误条件)。

让进程知道它应该重新打开(/重新创建)日志文件的常用方法是向它发送一个信号(例如USR1),告诉它它应该关闭以前的文件句柄(到删除的文件)并重新打开日志文件(它的新实例)。

使用logstream的简单PoC:

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();
});

或者,您可以定期检查日志文件是否仍可从文件系统访问,如果不是,则重新打开。