2012-03-07 38 views
10

¿Hay alguna manera de que pueda detectar la salida de la consola eventual causada por console.log(...) dentro de node.js para evitar la obstrucción del terminal mientras la unidad prueba un módulo?Captura de console.log en node.js?

Gracias

Respuesta

15

module.js:

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

programa:

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

Editar: Obviamente se puede recoger los mensajes de registro para más adelante si lo desea:

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

Una forma mejor podría ser conectar directamente la salida que necesita para capturar datos, porque con el método de Linus si algún módulo escribe directamente en stdout con process.stdout.write('foo'), por ejemplo, no será capturado.

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

EDITAR

console.log() termina su producción con una nueva línea, es posible que desee despojarlo así que es mejor escribir:

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

EDITAR

mejorada , manera genérica de hacer esto en cualquier método de cualquier objeto con soporte asíncrono See the gist.

+0

Gran solución @ Kevin - Esto me ayudó a cabo tanto con una prueba - incluso aprox 5 años después. ¡Pulgares hacia arriba! – RobC

0

sólo tiene que añadir el siguiente fragmento de código le permitirá capturar los registros y todavía lo imprime en la consola:

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