Korzystanie z console.log () w aplikacji Electron


117

Jak mogę rejestrować dane lub wiadomości na konsoli w mojej aplikacji Electron?

Ten naprawdę podstawowy świat hello otwiera domyślnie narzędzia programistyczne, których nie mogę używać console.log('hi'). Czy istnieje alternatywa dla Electron?

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

Odpowiedzi:


160

console.log działa, ale to, gdzie się loguje, zależy od tego, czy wywołujesz go z procesu głównego, czy z procesu renderowania.

Jeśli wywołasz go z procesu renderowania (tj. JavaScript, który jest zawarty w twoim index.htmlpliku), zostanie zarejestrowany w oknie narzędzi deweloperskich.

Jeśli wywołasz go z głównego procesu (tj. In main.js), będzie działał tak samo, jak w Node - zaloguje się do okna terminala. Jeśli rozpoczynasz proces Electron z terminalu electron ., możesz zobaczyć swoje console.logpołączenia z głównego procesu.


2
Czy mogę console.log()przejść do głównego procesu z procesu renderowania?
Fandi Susanto

1
@FandiSusanto, Możesz użyć modułu ipcRenderer, aby wysłać wiadomość do swojego głównego procesu, a następnie do console.log () w nim.
arthursfreire

23
Co dzieje się w trybie produkcyjnym, co zrobi console.log () `w głównym procesie
Jimmy Obonyo Abor

16
@JimmyObonyoAbor Aby podłączyć konsolę do produkcyjnej aplikacji elektronowej i uzyskać dane wyjściowe konsoli w terminalu, uruchom w terminalu następujące polecenie ./path/to/release/MyProgram.app/Contents/MacOS/MyProgram. Spowoduje to uruchomienie pliku binarnego MyProgrami umożliwi przeglądanie console.logzdarzeń procesu w terminalu.
datUser

jak mogę nadal logować rzeczy do terminala po zresetowaniu aplikacji przez app.relaunch()i app.exit(0)???
oldboy

38

Możesz także dodać zmienną środowiskową w systemie Windows:

ELECTRON_ENABLE_LOGGING=1

Spowoduje to wyświetlenie komunikatów konsoli na twoim terminalu.


Nie widziałem żadnych komunikatów w konsoli, dopóki ta zmienna środowiskowa nie została ustawiona.
DVK

7
W docs powiedzieć, że powinien być ustawiony truei ustawienie go na true„wydruki wewnętrzne rejestrowanie Chrome do konsoli”, który nie jest tym, co PO chce.
puszkin

@pushkin Działa ELECTRON_ENABLE_LOGGING=1również z. A co do tego, czego chce PO? Spójrz na następującą istotę, aby zobaczyć efekt.
x-yuri

Do którego pliku dodano ELECTRON_ENABLE_LOGGING = 1?
Still_learning

1
@Still_learning ustawiasz ją jako zmienną środowiskową. więc z wiersza poleceń systemu Windowsset ELECTRON_ENABLE_LOGGING=true
pushkin

30

Istnieje inny sposób logowania się do konsoli z wnętrza procesu renderowania. Biorąc pod uwagę, że jest to Electron, możesz uzyskać dostęp do natywnych modułów Node. Obejmuje to consolemoduł.

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

Kiedy ten kod jest uruchamiany z wnętrza procesu renderowania, otrzymasz Hello World!terminal, z którego uruchomiłeś Electron.

Więcej dokumentacji na temat modułu można znaleźć pod adresem https://nodejs.org/api/console.htmlconsole .


15

Jeszcze inną możliwością jest dostęp do głównej konsoli procesu za pomocą remote.getGlobal(name):

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

1
Działa to świetnie, ale jak możemy przechwycić dane wyjściowe całej konsoli; tj. - bez konieczności wywoływania specjalnej funkcji; tak, że wyjątki i błędy są również wyprowadzane?
Derrick,

1
Derrick: Spróbuj ustawić zmienną środowiskową ELECTRON_ENABLE_LOGGING=1(zobacz odpowiedź
deejbee

Próbuję użyć skryptu działającego w tle dla rozszerzenia, ale nie działa, nie jest jasne, dlaczego. (skrypty działające w tle są ładowane jako okna w tle, w zasadzie)
Narfanator

7

Dodając do odpowiedzi M. Damiana, oto jak to skonfigurowałem, abym mógł uzyskać dostęp do konsoli głównego procesu z dowolnego renderera.

W swojej głównej aplikacji dodaj:

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

W każdym rendererze możesz dodać:

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
Chociaż ten kod może pomóc w rozwiązaniu problemu, nie wyjaśnia, dlaczego i / lub jak odpowiada na pytanie. Zapewnienie tego dodatkowego kontekstu znacznie poprawiłoby jego długoterminową wartość. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, w tym, co stosuje się ograniczenia i założenia.
Toby Speight,

5

Możesz skorzystać z pakietu npm electron-log https://www.npmjs.com/package/electron-log

Będzie rejestrować twój błąd, ostrzegać, informować, rozwiązywać, debugować, głupie dane wyjściowe w twoim natywnym dzienniku systemu operacyjnego.

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

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

4

To jest kontynuacja odpowiedzi cscsandy5 na dodatkowe informacje, informacje stąd

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

Ten kod działa świetnie po prostu wyprowadzając prosty komunikat debugowania do okna terminala, z którego uruchomiłeś aplikację electron, i jest tym, na podstawie którego zbudowany jest console.log.

Oto przykładowy fragment (oparty na tutorialspoint electon tutorial) skryptu jQuery, który zapisze cześć do terminala za każdym razem, gdy przycisk zostanie naciśnięty (ostrzeżenie: musisz dodać własne podziały wierszy w łańcuchach wyjściowych!)

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

Wszystko napisał Alex Warren, jest prawdą. Tutaj ważne jest, jak uruchamia się Electron. Jeśli użyjesz standardowego skryptu w pliku package.json , to nie zadziała. Robićconsole.log() pracować, zamień stary skrypt na nowy.

Stary:

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

Nowy:

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

Teraz wszystkie console.log()połączenia są również wyświetlane w terminalu.


2

Oto, czego używam:

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 + "');");
}

Przykładowe zastosowanie (tak samo jak console.log):

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

Źródło: https://github.com/fuse-box/fuse-box-electron-seed/tree/master/src/main w pliku logger.js, tutaj możesz zobaczyć prawdziwy przypadek użycia.


Dane muszą być jednak zakodowane (jako ciąg JSON?), Aby uniknąć wstrzyknięć kodu JS.
Zmey

2

Po pewnym dochodzeniu, oto moje zrozumienie:

Kod

(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
  })
}
...

Uwaga: którego użyć openDevToolsdo otwarciaElectron Dev Tools

(2) render.js

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

(3) render.jsjest wywoływany przez:index.html

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

console.log

Logika wyjściowa

  • dwa procesy i jego dane wyjściowe console.log :
    • main process= NodeJS process= tutajElectron UI process
      • -> console.login main.jswyświetli tutaj log
    • render process
      • -> console.login render.jswyświetli tutaj log

Przykład zrzutu ekranu

  • DEBUG = tryb programowania
    • biegać ./node_modules/.bin/electron .
  • Produkcja = Tryb wydania = xxx.app zapakowany przezeletron-builder
    • biegać /path_to_your_packaged_mac_app/xxx.app/Contents/MacOS/yourBinaryExecutable
    • dodane export ELECTRON_ENABLE_LOGGING=true, render.jsconsole.log TAKŻE wyjście do main processterminala

1

Przepraszam, że podnoszę stary wątek, ale to jest najlepszy wynik dla zapytania „jak przesłać plik console.log do terminala” (lub podobnych wyszukiwań.

Dla każdego, kto chce uzyskać nieco większą kontrolę nad tym, co jest wyświetlane na terminalu, możesz użyć webContents.on ('komunikat konsoli') w następujący sposób:

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

Widzieć:

webContents Dokumentacja

webContents w dokumentacji BrowserWindow


1

console.log()będzie działać dobrze do debugowania. Ponieważ electronjest zbudowany w oparciu o przeglądarkę, DevToolsobsługuje narzędzia programistyczne do debugowania. Istnieje jednak histeryczne zachowanie console.log()metody. Gdy wywołasz aplikację console.log()from main processelectron app, zostanie ona wyświetlona w oknie terminala, z którego właśnie uruchomiłeś aplikację, a po wywołaniu jej z renderer processniej wyświetli się na konsoli DevTools.


1

Dzięki temu możesz użyć narzędzi programistycznych w głównym oknie przeglądarki, aby wyświetlić dzienniki

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

Przykład logEverywhere('test') pojawi się // testw panelu konsoli narzędzi programistycznych głównego okna przeglądarki

Możesz potrzebować ulepszenia tej metody, aby akceptować wiele argumentów (możesz to zrobić za pomocą operatora spreadu za pomocą es6)


1

Cóż, to rok 2019 i nie mogę uwierzyć, że nikt nie wspomniał o tej sztuczce we wszystkich powyższych odpowiedziach. Ok, a co powiesz na zalogowanie się bezpośrednio do konsoli przeglądarki bezpośrednio z głównej? Podałem moją odpowiedź tutaj: https://stackoverflow.com/a/58913251/8764808 Spójrz.


Dzięki @Wale! Czy mógłbyś wpisać swoją odpowiedź? Nie mam nic przeciwko linkowi do innego pytania, ale wiele modów tutaj wkurza się, że krzyżują odpowiedzi nawet z SO.
Don P

Naprawdę bardzo bym chciał, ale znowu, kiedy ostatnio próbowałem to zrobić, dostałem reprymendę za powielanie odpowiedzi.
Wale,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.