我已将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;
});
答案 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();
});
或者,您可以定期检查日志文件是否仍可从文件系统访问,如果不是,则重新打开。