jul*_*bou 4 virtual-machine node.js
在node.js vm模块中,我可以在另一个node.js进程中执行一些javascript.我想要实现的是能够捕获由vm运行的脚本中执行的日志.
例如,我想抓住"foobar"日志:
var vm = require('vm')
vm.runInThisContext('console.log("foobar");', 'myfile.vm');
// how can i get the "foobar" log?
Run Code Online (Sandbox Code Playgroud)
提前致谢
编辑:下面的答案很好,虽然有一个较短的版本:
function captureStdout(callback) {
var output = '', old_write = process.stdout.write
// start capture
process.stdout.write = function(str, encoding, fd) {
output += str
}
callback()
// end capture
process.stdout.write = old_write
return output
}
Run Code Online (Sandbox Code Playgroud)
也许更好,所以只需将当前控制台转发到新创建的上下文对象:
let contextObj = {
console: console
};
Run Code Online (Sandbox Code Playgroud)
你可以直接包装console.log:
function hook_consolelog(callback) {
var old_log = console.log;
console.log = (function(write) {
return function() {
write.apply(console, arguments)
callback.apply(null, arguments);
}
})(console.log)
return function() {
console.log = old_log;
}
}
var result;
var unhook = hook_consolelog(function(v) {
result = v;
});
console.log('hello');
unhook();
console.log('goodbye');
console.log('the result is ', result);?
Run Code Online (Sandbox Code Playgroud)
由于console.log只是调用process.stdout,另一种方法是使用一些包装器魔法捕获stdout事件,如下所示:
var util = require('util')
function hook_stdout(callback) {
var old_write = process.stdout.write
process.stdout.write = (function(write) {
return function(string, encoding, fd) {
write.apply(process.stdout, arguments)
callback(string, encoding, fd)
}
})(process.stdout.write)
return function() {
process.stdout.write = old_write
}
}
var unhook = hook_stdout(function(string, encoding, fd) {
util.debug('stdout: ' + util.inspect(string))
if( string == 'foobar' ) { unhook(); }
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2152 次 |
| 最近记录: |