Захват console.log в node.js?

Есть ли способ, которым я могу поймать конечный вывод консоли, вызванный console.log(...) внутри node.js, чтобы предотвратить засорение терминала при модуле тестирования модуля?

Спасибо

Ответ 1

module.js:

module.exports = function() {
    console.log("foo");
}

Программа:

console.log = function() {};
mod = require("./module");
mod();
// Look ma no output!

Изменить: Очевидно, что вы можете собирать сообщения журнала позже, если хотите:

var log = [];
console.log = function() {
    log.push([].slice.call(arguments));
};

Ответ 2

Лучше всего было бы напрямую подключить вывод, который вам нужно поймать, потому что с помощью метода Linus, если какой-либо модуль записывает непосредственно в stdout с помощью 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);
});

ИЗМЕНИТЬ

console.log() завершает вывод с помощью новой строки, вы можете снять его, чтобы лучше писать:

_stream.write = function(string, encoding, fd) {
    var new_str = string.replace(/\n$/, '');
    fn(new_str, encoding, fd);
};

ИЗМЕНИТЬ

Улучшенный общий способ сделать это по любому методу любого объекта с поддержкой async См. раздел.

Ответ 3

Просто добавьте следующий фрагмент кода в свой код, чтобы вы могли ловить журналы и все еще печатать его на консоли:

var log = [];
console.log = function(d) {
    log.push(d);
    process.stdout.write(d + '\n');
};