2015-09-08 3 views
0

Я перенаправил console.log() в файл (app_stdout.log) Далее запускаю свою программу. Создается файл app_stdout.log. Но если вручную удалить файл журнала при запуске программы, файл app_stdout.log не будет создан снова. Зачем? Что мне здесь не хватает? есть ли способ, которым я могу поймать ошибку из WriteStream?Перенаправлено console.log() в файл. Файл журнала не создается снова, если файл журнала удален вручную

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

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

ответ

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

В качестве альтернативы, можно периодически проверять, если файл_журнала еще доступен из файловой системы и заново, если это не так.