2012-03-07 21 views

答えて

15

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

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

EDIT

console.log()は改行と、その出力を終了し、あなたがより良い記述しますので、あなたはそれを取り除くしたいことがあります。改善された

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

EDIT

を非同期サポートを持つオブジェクトの任意のメソッドでこれを行う一般的な方法See the gist

+0

グレートソリューション - これは単なるテストでそんなに私を助けた - でも約5年後。いいぞ! – RobC

0

単にあなたのコードに次のコードを使用して、ログをキャッチし、まだコンソールでそれを印刷できるようになる追加:@kevin

var log = []; 
console.log = function(d) { 
    log.push(d); 
    process.stdout.write(d + '\n'); 
}; 
関連する問題