Javascript 钩住控制台。登录

Javascript 钩住控制台。登录,javascript,node.js,electron,Javascript,Node.js,Electron,我正在寻找连接到console.log的electron。 我尝试了下面提到的步骤: 虽然上述方法在node.js中效果良好,但同样的方法在electron中不起作用(electron基于node.js) 如何在电子中实现这一点? 我需要捕获对console.log和console.error的所有调用,这样我就可以使用模块electron log()钩住所有console.log和console.error调用。我认为这可以通过覆盖console.log或console.error来实现,如下

我正在寻找连接到console.log的electron。
我尝试了下面提到的步骤:
虽然上述方法在node.js中效果良好,但同样的方法在electron中不起作用(electron基于node.js)

如何在电子中实现这一点?

我需要捕获对console.log和console.error的所有调用,这样我就可以使用模块
electron log
()钩住所有console.log和console.error调用。

我认为这可以通过覆盖
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);
}
您可以在浏览器窗口中使用这些功能,对于主流程,您已经提到的功能应与一些自适应功能配合使用:

// 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
。在渲染过程中,您必须使用我上面提到的函数,因为Electron不创建任何流,而是让Chromium将所有消息记录到其开发人员控制台。

我认为这可以通过覆盖
控制台.log
控制台.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);
}
您可以在浏览器窗口中使用这些功能,对于主流程,您已经提到的功能应与一些自适应功能配合使用:

// 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
。在渲染过程中,您必须使用我上面提到的函数,因为Electron不创建任何流,而是让Chromium将所有消息记录到其开发人员控制台。

此解决方案缺少的一点是,它丢失了打印信息的行号上的信息。这在node.js中是可能的,根据这个链接:没错,但是因为我不认为BrowserWindow的
console.log
创建了一个流(主进程中
console.log
使用
stdout
),我不知道如何实现它……我明白了。那个么你们有并没有一个建议,它是如何从电子的主要过程中降下来的呢?我想通过BrowserWindow的
控制台.log
,您是指渲染器进程。正确。BrowserWindow在渲染器进程上执行。对于主进程,您可以使用前面提到的代码,但要用log函数替换
logs.push()
行。我会更新我的答案。这个解决方案缺少的一点是,它会丢失打印信息的行号上的信息。这在node.js中是可能的,根据这个链接:没错,但是因为我不认为BrowserWindow的
console.log
创建了一个流(主进程中
console.log
使用
stdout
),我不知道如何实现它……我明白了。那个么你们有并没有一个建议,它是如何从电子的主要过程中降下来的呢?我想通过BrowserWindow的
控制台.log
,您是指渲染器进程。正确。BrowserWindow在渲染器进程上执行。对于主进程,您可以使用前面提到的代码,但要用log函数替换
logs.push()
行。我会更新我的答案。