2017-12-30 36 views
0

私は電子のconsole.logにフックしようとしています。 https://stackoverflow.com/a/9624028/2091948
上記は、Node.jsの中でうまく動作しますが、これと同じアプローチが(にターンNode.jsのベースとなっている)電子では動作しません電子のconsole.logへのフック

どのようにすることができます:ここに述べたように、私は以下のステップを試してみました
私は電子でこれを達成する?
すべてのconsole.logとconsole.errorの呼び出しをキャプチャして、electron-loghttps://www.npmjs.com/package/electron-log)というモジュールを使用してすべてのconsole.logとconsole.error呼び出しをフックする必要があります。

答えて

1

私は、これはちょうどこのようconsole.logまたはconsole.errorをオーバーライドを経由して行うことができると思う:

また
var log = require("electron-log"); 

console.log = function (message) { 
    log.info(message); 
} 
console.error = function (message) { 
    log.error(message); 
} 

、古い機能を維持および/または後で使用するために、アレイ内のすべてのメッセージを保存したい場合、あなたは以下の機能を使用することができます。

var log = require("electron-log"), msgInfo = [], msgErr = []; 

// Preserve the old, built-in functions 
console.log_old = console.log; 
console.error_old = console.error; 

console.log = function (message) { 
    msgInfo.push(message); 
    log.info(message); 
} 

console.error = function (message) { 
    msgErr.push(message); 
    log.error(message); 
} 

あなたがメインのプロセスのために、あなたはすでに述べたcodeは、いくつかの調整で動作するはず、ブラウザウィンドウでこれらの機能を使用することができます。

// https://stackoverflow.com/a/9624028, written by "kevin" 
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); 
}), 

// require electron-log 
log = require("electron-log"); 

// 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) { 
    // Either log the contents of the message array... 
    //console.log('logged: ' + _log); 

    // ...or use electron-log to actually log them. 
    log.info(_log); 
}); 

NodeJSがストリームをstdoutに作成するため、このコードはメインプロセスで機能します。レンダラープロセスでは、エレクトロンはストリームを作成せず、Chromiumにすべてのメッセージをデベロッパーコンソールに記録させるため、上記の関数を使用する必要があります。

+1

このソリューションに欠けているものは、情報を印刷した行番号に関する情報が失われています。これはnode.jsでこのリンクで可能でした:https://stackoverflow.com/a/9624028/2091948 – vishal

+0

これは正しいですが、私はBrowserWindowの 'console.log'がストリームを作成するとは思わないので('メインプロセスの 'console.log'は' stdout'を使っています)、これがどのように実装されるのかわかりません... –

+0

私は参照してください。どのようにして主なプロセスから電子になる可能性があるのか​​、あなたは示唆を持っていますか? BrowserWindowの 'console.log'は、レンダラープロセスを意味します。 – vishal

関連する問題