Intereting Posts
Минимальный код для программного программирования в Стамбуле bcrypt.compare () всегда возвращает false при проверке паролей Включить блоки HTML Использование node.js Visual Studio не может комбинировать вывод JavaScript в один файл. Есть ли какая-то корректировка, мне нужно сделать больше? Как добавить отображение подстановочных знаков при входе в webpack Заголовок Etag не возвращается из jQuery.ajax () cross-origin XHR Как вызвать функцию после цикла асинхронного цикла значений объекта, завершенного Импорт / экспорт express-маршрутизатора с использованием импортных и экспортных ключевых слов ES6 и Babel npm package.json main и структура проекта Express.js- добавить тело ответа Обновление по агрегату в Монгобе EventMachine vs Node.js Как отлаживать тест npm Последовательный дочерний процесс узла сразу же после упаковки электронного приложения В чем разница между process.cwd () и process.env.PWD?

Перенаправление stdout в файл nodejs

Я создал:

var access = fs.createWriteStream('/var/log/node/api.access.log', { flags: 'w' }); 

Затем по трубопроводу:

 process.stdout.pipe(access); 

Затем попытался:

 console.log("test"); 

И ничего не появилось в /var/log/node/api.access.log. Однако этот способ работает:

 process.stdout.pipe(access).write('test'); 

Может ли кто-нибудь объяснить, что я делаю неправильно?

Я решил эту проблему следующим образом:

 var access = fs.createWriteStream('/var/log/node/api.access.log'); process.stdout.write = process.stderr.write = access.write.bind(access); 

Конечно, вы также можете отделить stdout и stderr, если хотите.

Я также настоятельно рекомендую обрабатывать исключенные исключения:

 process.on('uncaughtException', function(err) { console.error((err && err.stack) ? err.stack : err); }); 

Это будет охватывать следующие ситуации:

  • process.stdout.write
  • process.stderr.write
  • console.log
  • console.dir
  • console.error
  • someStream.pipe (process.stdout);
  • throw new Error (‘Crash’);
  • бросить «никогда не делай этого»;
  • бросать неопределенный;

console . console , родительский class обычной console .

 var myLogFileStream = fs.createWriteStream(pathToMyLogFile); var myConsole = new console.Console(myLogFileStream, myLogFileStream); 

Затем вы можете использовать myConsole.log , myConsole.error , myConsole.dir и т. Д. И писать непосредственно в свой файл.

Вы также можете выполнить патч process.stdout.write следующим образом:

 var fn = process.stdout.write; function write() { fn.apply(process.stdout, arguments); myLogFileStream.write.apply(myLogFileStream, arguments); } process.stdout.write = write; 

есть также другие опции для перезаписи console._stdout зависимости от мотивации для записи stdout в файл.

process.stdout является Writable. pipe – метод Readable (документация Cf StreamAPI: https://nodejs.org/api/stream.html

Вы можете увидеть документацию process.stdout здесь: https://nodejs.org/api/process.html#process_process_stdout

Удивительно, что вы можете сделать process.stdout.pipe(...); без каких-либо ошибок. Но я полагаю, что этот призыв просто ничего не делает. За исключением возврата нового streamа Writable, связанного с stdout (или, возможно, он возвращает process.stdout самостоятельно. В документации нет спецификации).

Если вы хотите перенаправить stdout в файл, у вас есть много решений:

  • Просто используйте свою командную строку для этого. Стиль Windows: node myfile.js > api.access.log .
  • Замените объект консоли на свой собственный объект. И вы можете переписать консольные методы.
  • Я не уверен, но может быть возможно заменить process.stdout собственным streamом (и вы можете делать все, что захотите)