Лучшим способом может быть непосредственное подключение вывода, который вам необходим для перехвата данных, потому что при использовании метода Линуса, если какой-либо модуль пишет напрямую в стандартный вывод с process.stdout.write('foo')
, например, он не будет перехвачен.
var logs = [],
hook_stream = function(_stream, fn) {
// Reference default write method
var old_write = _stream.write;
// _stream now write with our shiny function
_stream.write = fn;
return function() {
// reset to the default write method
_stream.write = old_write;
};
},
// hook up standard output
unhook_stdout = hook_stream(process.stdout, function(string, encoding, fd) {
logs.push(string);
});
// goes to our custom write method
console.log('foo');
console.log('bar');
unhook_stdout();
console.log('Not hooked anymore.');
// Now do what you want with logs stored by the hook
logs.forEach(function(_log) {
console.log('logged: ' + _log);
});
EDIT
console.log()
заканчивает вывод новой строкой, вы можете удалить ее, поэтому лучше написать:
_stream.write = function(string, encoding, fd) {
var new_str = string.replace(/\n$/, '');
fn(new_str, encoding, fd);
};
EDIT
Улучшенный общий способ сделать это на любом методе любого объекта с поддержкой асинхронного доступа См. Суть .