在node.js中捕获console.log?

时间:2012-03-07 21:32:16

标签: node.js module callback

我是否有办法在node.js中捕获由console.log(...)引起的最终控制台输出,以防止在单元测试模块时堵塞终端?

由于

4 个答案:

答案 0 :(得分:23)

更好的方法是直接连接你需要捕获数据的输出,因为使用Linus方法,如果某个模块直接写入带有process.stdout.write('foo')的stdout,它就不会被捕获。

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

修改

使用异步支持See the gist的任何对象的任何方法执行此操作的改进的通用方法。

答案 1 :(得分:16)

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 :(得分:1)

capture-console很好地解决了这个问题。

var capcon = require('capture-console');

var stderr = capcon.captureStderr(function scope() {
  // whatever is done in here has stderr captured,
  // the return value is a string containing stderr
});

var stdout = capcon.captureStdout(function scope() {
  // whatever is done in here has stdout captured,
  // the return value is a string containing stdout
});

及以后

  

拦截

     

您应该注意,所有capture函数仍会将值传递给主stdio write()函数,因此日志记录仍将进入标准IO设备。

     

如果不希望这样做,可以使用intercept函数。与上面显示的功能相比,这些功能在字面上是s/capture/intercept,唯一的区别是调用不会转发到基本实现。

答案 3 :(得分:0)

只需将以下代码段添加到您的代码中,您就可以捕获日志并仍然在控制台中打印:

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