Використання console.log () в додатку Electron


116

Як я можу записувати дані чи повідомлення на консоль у своєму додатку Electron?

Цей справді основний привіт світ відкриває інструменти розробки за замовчуванням, я не можу використовувати console.log('hi'). Чи існує альтернатива для Електрона?

main.js

var app = require('app');
var BrowserWindow = require('browser-window');

require('crash-reporter').start();

var mainWindow = null;

app.on('window-all-closed', function() {
  // Mac OS X - close is done explicitly with Cmd + Q, not just closing windows
  if (process.platform != 'darwin') {
    app.quit();
  }
});

app.on('ready', function(){
  mainWindow = new BrowserWindow({ width: 800, height: 600});

  mainWindow.loadUrl('file://' + __dirname + '/index.html');

  mainWindow.openDevTools();

  mainWindow.on('closed', function(){
    mainWindow = null;
  });
});

Відповіді:


158

console.log працює, але там, де він реєструється, залежить від того, ви викликаєте його з основного процесу чи процесу візуалізації.

Якщо ви зателефонуєте до нього в процесі візуалізації (тобто JavaScript, який включений у ваш index.htmlфайл), він буде записаний у вікно інструментів розробників.

Якщо ви викликаєте його з основного процесу (тобто в main.js), він буде працювати так само, як і у Node - він увійде до вікна терміналу. Якщо ви запускаєте електронний процес із Терміналу за допомогою терміналу, electron .ви можете бачити console.logдзвінки з основного процесу там.


2
Чи можу я console.log()провести основний процес із процесу відтворення?
Фанді Сусанто

1
@FandiSusanto, Ви можете використовувати модуль ipcRenderer, щоб надіслати повідомлення вашому головному процесу, а потім - console.log () всередині нього.
arthursfreire

23
Що перебуває в режимі виробництва, що робитиме console.log () `в основному процесі
Jimmy Obonyo Abor

16
@JimmyObonyoAbor Щоб приєднати консоль до виробничого електронного додатка та отримати консольний вихід у своєму терміналі, виконайте наступне в терміналі ./path/to/release/MyProgram.app/Contents/MacOS/MyProgram. Це запустить двійкове MyProgramі дозволить вам переглядати console.logподії процесу в терміналі.
датаУсер

як я можу все-таки ввійти до терміналу після скидання програми через app.relaunch()та app.exit(0)???
oldboy

38

Ви також можете додати змінну середовища у Windows:

ELECTRON_ENABLE_LOGGING=1

Це виведе консольні повідомлення на ваш термінал.


Я не бачив жодного повідомлення в консолі, поки ця змінна середовище не була встановлена.
DVK

7
У документах кажуть , що повинно бути встановлені trueі встановити його в true«відбитки внутрішнього протоколювання Chrome на консоль», яка є не те , що ОП хоче.
пушкін

@pushkin З цим також працює ELECTRON_ENABLE_LOGGING=1. А щодо того, чого хоче ОП, що це тоді? Погляньте на наступну суть, щоб побачити ефект.
x-yuri

У який файл додано ELECTRON_ENABLE_LOGGING = 1?
Still_learning

1
@Still_learning ви встановлюєте його як змінну середовища. так з командного рядка Windowsset ELECTRON_ENABLE_LOGGING=true
pushkin

30

Існує ще один спосіб входу в консоль зсередини процесу візуалізації. З огляду на це Electron, ви можете отримати доступ до власних модулів Node. Сюди входить consoleмодуль.

var nodeConsole = require('console');
var myConsole = new nodeConsole.Console(process.stdout, process.stderr);
myConsole.log('Hello World!');

Коли цей код запускається всередині процесу візуалізації, ви потрапляєте Hello World!в термінал, з якого запущено Electron.

Див. Https://nodejs.org/api/console.html для подальшої документації про consoleмодуль.


15

Ще одна можливість доступу до головної консолі процесора за допомогою remote.getGlobal(name):

const con = require('electron').remote.getGlobal('console')
con.log('This will be output to the main process console.')

1
Це чудово працює, але як ми можемо отримати весь вихід консолі; тобто без необхідності виклику спеціальної функції; такі, що винятки та помилки також видаються?
Деррік

1
Деррік: Спробуйте встановити змінну оточення ELECTRON_ENABLE_LOGGING=1(див. Відповідь
deejbee

Я намагаюся використовувати всередині фонового сценарію для розширення, і це не працює, незрозуміло, чому. (фонові сценарії в основному завантажуються як фонові вікна)
Narfanator

7

Додавши відповідь М. Даміана, ось як я налаштував її, щоб я мав доступ до консолі основного процесу від будь-якого рендерінга.

У головному додатку додайте:

const electron = require('electron');
const app = electron.app;
const console = require('console');
...
app.console = new console.Console(process.stdout, process.stderr);

У будь-якому рендері можна додати:

const remote = require('electron').remote;
const app = remote.app;
...
app.console.log('This will output to the main process console.');

5
process.stdout.write('your output to command prompt console or node js ')

4
Хоча цей код може допомогти вирішити проблему, він не пояснює, чому та / або як він відповідає на питання. Надання цього додаткового контексту значно покращило б його довгострокове значення. Будь ласка , змініть свій відповідь , щоб додати пояснення, в тому числі те , що застосовувати обмеження і допущення.
Toby Speight

5

Ви можете використовувати електронний журнал пакета npm https://www.npmjs.com/package/electron-log

Він запише вашу помилку, попереджає, інфо, багатослівний, налагодження, нерозумні виходи у вашому рідному журналі журналу OS.

var log = require('electron-log');

log.info('Hello, log');
log.error('Damn it, an error');

4

Це подальший відповідь на відповідь cscsandy5 за деякою додатковою інформацією, інформацією звідси

process.stdout.write('your output to command prompt console or node js ')

Цей код відмінно підходить для виведення простого повідомлення про налагодження до вікна терміналу, з якого запущено додаток для електронних програм, і це те, на чому створено console.log.

Ось приклад фрагменту (заснований на навчальному посібнику з електронного підручника) сценарію jQuery, який буде писати привіт до терміналу щоразу, коли натискається кнопка (попередження: вам потрібно додати власні розриви рядків у вихідних рядках!)

let $ = require('jquery')
var clicks = 0;

$(function() {
    $('#countbtn').click(function() {
        //output hello <<<<<<<<<<<<<<<<<<<<<<<
        process.stdout.write('hello')

        $('#click-counter').text(++clicks);
    });

    $('#click-counter').text(clicks);
});

2

Все, що написав Алекс Уоррен, є правдою. Тут важливим є те, як запускається Електрон. Якщо ви використовуєте стандартний скрипт у файлі package.json, він не працюватиме. Щоб console.log()робота замінила старий сценарій на новий.

Старий:

"scripts": {
    "start": "electron ."
}

Новий:

"scripts": {
    "start": ".\\node_modules\\electron\\dist\\electron.exe ."
}

Тепер усі console.log()дзвінки відображаються і в терміналі.


2

Це те, що я використовую:

let mainWindow // main window reference, you should assign it below 'mainWindow = new BrowserWindow'

function log(...data) {
  mainWindow.webContents.executeJavaScript("console.log('%cFROM MAIN', 'color: #800', '" + data + "');");
}

Приклад використання (те саме console.log):

log('Error', { msg: 'a common log message' })
log('hello')

Джерело: https://github.com/fuse-box/fuse-box-electron-seed/tree/master/src/main у файлі logger.js, тут ви можете побачити реальний випадок використання.


Дані потрібно кодувати, хоча (як рядок JSON?), Щоб уникнути ін'єкції коду JS.
Змей

2

Після деякого розслідування, ось моє розуміння:

Код

(1) main.js


const createPyProc = () => {
  console.log('In createPyProc')
...
  console.log('scriptStart=%s', scriptStart)
...
  console.log('scriptOther=%s', scriptOther)
...
}

...

let mainWindow = null

const createWindow = () => {
  mainWindow = new BrowserWindow(
    {
      width: 1024,
      height: 768,
      webPreferences: {
        nodeIntegration: true,
      }
    }
  )
  mainWindow.loadURL(require('url').format({
    pathname: path.join(__dirname, 'index.html'),
    protocol: 'file:',
    slashes: true
  }))
  mainWindow.webContents.openDevTools()

  mainWindow.on('closed', () => {
    mainWindow = null
  })
}
...

Примітка: яке використання openDevToolsдля відкриттяElectron Dev Tools

(2) render.js

const zerorpc = require("zerorpc")
...
    console.log("clientStart %d server is ready", PORT_START)
...
})

(3) render.jsвикликається:index.html

<!DOCTYPE html>
<html>
...
  <script>
    require('./renderer.js')
  </script>
</html>

console.log

Вихідна логіка

  • два процеси та вихід його console.log :
    • main process= NodeJS process= тутElectron UI process
      • -> console.logу main.jsвиведе тут журнал
    • render process
      • -> console.logу render.jsвиведе тут журнал

Приклад знімка екрана

  • DEBUG = Режим розробки
    • бігати ./node_modules/.bin/electron .
  • Виробництво = Реліз випуску = xxx.app, запакований користувачемeletron-builder
    • бігати /path_to_your_packaged_mac_app/xxx.app/Contents/MacOS/yourBinaryExecutable
    • додано export ELECTRON_ENABLE_LOGGING=true, render.jsconsole.log ТАКОЖ вихід до main processтерміналу

1

Вибачте, що підняли стару тему, але це найкращий результат для "як вивести console.log до терміналу" (або подібні пошуки.

Для всіх, хто хоче отримати трохи більше контролю над тим, що виводиться на термінал, ви можете використовувати webContents.on ("консольне повідомлення") так:

mainWindow.webContents.on('console-message', (event, level, message, line, sourceId) => {
      console.log(message + " " +sourceId+" ("+line+")");
});

Побачити:

Документація webContents

Запис webContents в документах BrowserWindow


1

console.log()буде добре працювати для налагодження. Оскільки electronвбудований поверх браузера, він має DevToolsпідтримку, яку ви можете використовувати devtools для налагодження. Однак існує істерична поведінка console.log()методу. Коли ви зателефонуєте console.log()з main processпрограми електрон, вона виведе в вікно терміналу, звідки ви тільки що запустили додаток, і коли ви зателефонуєте з renderer processнього, він виведе на консоль DevTools.


1

За допомогою цього ви можете використовувати інструменти для розробників головного вікна браузера для перегляду журналів

    function logEverywhere(s) {
        if (_debug === true) {
            console.log(s);
            // mainWindow is main browser window of your app
            if (mainWindow && mainWindow.webContents) {
                mainWindow.webContents.executeJavaScript(`console.log("${s}")`);
            }
        }
    }

Приклад logEverywhere('test') виведе // testна консольну панель основних інструментів розробника вікна браузера

Вам може знадобитися вдосконалити цей метод, щоб прийняти кілька аргументів (Ви можете це зробити з оператором розширення за допомогою es6)


1

Ну, це 2019 рік, і я не можу повірити, що ніхто не згадав цю хитрість у всіх відповідях вище. Добре, а як щодо входу в систему безпосередньо на консолі браузера безпосередньо з головної? Свою відповідь я надав тут: https://stackoverflow.com/a/58913251/8764808 Погляньте.


Дякую @Wale! Ви б проти зауважити свою відповідь? Я не заперечую над посиланням на інше питання, але багато модників тут набридають з приводу перехресних зв’язків відповідей навіть із ТАК.
Дон П

Я б насправді полюбив, але знову ж таки, коли я останній раз намагався це зробити, мені доручили за дублювання відповідей.
Wale
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.