ใช้ console.log () ในแอพ Electron


118

ฉันจะบันทึกข้อมูลหรือข้อความไปยังคอนโซลในแอป Electron ได้อย่างไร

สวัสดีโลกขั้นพื้นฐานจริงๆนี้เปิดเครื่องมือสำหรับนักพัฒนาโดยค่าเริ่มต้นโดยที่ฉันไม่สามารถใช้งานconsole.log('hi')ได้ มีทางเลือกอื่นสำหรับ 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;
  });
});

คำตอบ:


161

console.log ใช้งานได้ แต่จะบันทึกไปที่ใดขึ้นอยู่กับว่าคุณเรียกใช้จากกระบวนการหลักหรือกระบวนการแสดงผล

หากคุณเรียกใช้จากกระบวนการ renderer (เช่น JavaScript ที่รวมอยู่ในindex.htmlไฟล์ของคุณ) ระบบจะบันทึกลงในหน้าต่างเครื่องมือ dev

หากคุณเรียกใช้จากกระบวนการหลัก (เช่นในmain.js) มันจะทำงานในลักษณะเดียวกับที่ทำในโหนด - มันจะเข้าสู่หน้าต่างเทอร์มินัล หากคุณกำลังเริ่มกระบวนการ Electron จาก Terminal โดยใช้electron .คุณสามารถดูการconsole.logโทรของคุณจากกระบวนการหลักที่นั่น


2
ฉันสามารถconsole.log()เข้าสู่กระบวนการหลักจากกระบวนการ renderer ได้หรือไม่?
Fandi Susanto

1
@FandiSusanto คุณสามารถใช้โมดูล ipcRenderer เพื่อส่งข้อความไปยังกระบวนการหลักของคุณจากนั้น console.log () ข้างใน
arthursfreire

23
สิ่งที่อยู่ในโหมดการผลิตสิ่งที่จะ 'console.log () `ในกระบวนการหลักทำอย่างไร
Jimmy Obonyo Abor

16
@JimmyObonyoAbor การแนบคอนโซลกับการผลิตแอพพลิเคอิเล็กตรอนและได้รับการส่งออกคอนโซลใน terminal ./path/to/release/MyProgram.app/Contents/MacOS/MyProgramการทำงานของคุณต่อไปนี้ในขั้ว สิ่งนี้จะเรียกใช้ไบนารีMyProgramและอนุญาตให้คุณดูconsole.logเหตุการณ์ของกระบวนการในเทอร์มินัล
datUser

ฉันจะบันทึกข้อมูลไปยังเทอร์มินัลได้อย่างไรหลังจากรีเซ็ตแอปผ่านapp.relaunch()และapp.exit(0)???
oldboy

38

คุณยังสามารถเพิ่มตัวแปรสภาพแวดล้อมใน windows:

ELECTRON_ENABLE_LOGGING=1

สิ่งนี้จะส่งออกข้อความคอนโซลไปยังเทอร์มินัลของคุณ


ฉันไม่เห็นข้อความใด ๆ ในคอนโซลจนกว่าจะตั้งค่าตัวแปรสภาพแวดล้อมนี้
DVK

7
เอกสารบอกว่าควรจะตั้งtrueและการตั้งค่าให้true"พิมพ์เข้าสู่ระบบภายในของ Chrome เพื่อคอนโซล" ซึ่งเป็นสิ่งที่ไม่ต้องการ OP
pushkin

@pushkin ก็ใช้ได้ELECTRON_ENABLE_LOGGING=1เช่นกัน และสิ่งที่ OP ต้องการคืออะไร? ดูส่วนสำคัญต่อไปนี้เพื่อดูผลกระทบ
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!');

เมื่อรหัสนี้ถูกเรียกใช้จากภายในกระบวนการ renderer คุณจะเข้าไป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
วิธีนี้ใช้งานได้ดี แต่เราจะจับเอาท์พุทคอนโซลทั้งหมดได้อย่างไร คือ - โดยไม่ต้องเรียกใช้ฟังก์ชันพิเศษ ดังนั้นจึงมีการแสดงข้อยกเว้นและข้อผิดพลาดด้วย?
Derrick

1
Derrick: ลองตั้งค่าตัวแปรสภาพแวดล้อมELECTRON_ENABLE_LOGGING=1(ดูคำตอบของ deejbee)
raphinesse

ฉันกำลังพยายามใช้ในสคริปต์พื้นหลังสำหรับส่วนขยาย แต่มันใช้งานไม่ได้ไม่ชัดเจนว่าทำไม (สคริปต์พื้นหลังถูกโหลดเป็นหน้าต่างพื้นหลังโดยทั่วไป)
Narfanator

7

เมื่อเพิ่มคำตอบของ M. Damian นี่คือวิธีตั้งค่าเพื่อให้สามารถเข้าถึงคอนโซลของกระบวนการหลักจากตัวแสดงผลใด ๆ

ในแอปหลักของคุณให้เพิ่ม:

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.');

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

4
แม้ว่ารหัสนี้อาจช่วยในการแก้ปัญหาก็ไม่ได้อธิบายว่าทำไมและ / หรือวิธีการที่มันสามารถตอบคำถามได้ การให้บริบทเพิ่มเติมนี้จะช่วยเพิ่มคุณค่าในระยะยาวได้อย่างมาก โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงข้อ จำกัด และสมมติฐานที่ใช้
Toby Speight

5

คุณสามารถใช้ npm package electron-log https://www.npmjs.com/package/electron-log

มันจะบันทึกข้อผิดพลาดของคุณเตือนข้อมูล verbose ดีบั๊กผลลัพธ์โง่ ๆ ในบันทึกระบบปฏิบัติการดั้งเดิมของคุณ

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 สร้างขึ้นด้านบนของ

นี่คือตัวอย่าง snippet (ตามบทช่วยสอน electon tutorialspoint) ของสคริปต์ 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

ทุกสิ่งที่Alex Warren เขียนเป็นความจริง สิ่งสำคัญคือวิธีการเริ่มต้นของอิเล็กตรอน หากคุณใช้สคริปต์มาตรฐานในไฟล์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
Zmey

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 ไปที่ terminal" (หรือการค้นหาที่คล้ายกัน

สำหรับใครก็ตามที่ต้องการควบคุมสิ่งที่ส่งออกไปยังเทอร์มินัลมากขึ้นอีกเล็กน้อยคุณสามารถใช้ webContents.on ('console-message') ดังนี้:

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()from main processof electron แอปจะส่งออกไปยังหน้าต่างเทอร์มินัลจากจุดที่คุณเพิ่งเปิดใช้แอปและเมื่อคุณเรียกใช้จากแอป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ในแผงคอนโซลของเครื่องมือสำหรับนักพัฒนาของหน้าต่างเบราว์เซอร์หลัก

คุณอาจต้องปรับปรุงวิธีนี้เพื่อยอมรับหลาย args (คุณสามารถทำได้ด้วยตัวดำเนินการกระจายโดย es6)


1

นี่คือปี 2019 และฉันไม่อยากเชื่อเลยว่าไม่มีใครพูดถึงเคล็ดลับนี้ในคำตอบทั้งหมดข้างต้น ตกลงแล้วจะเข้าสู่คอนโซลเบราว์เซอร์โดยตรงจากหลักได้อย่างไร? ฉันให้คำตอบที่นี่: https://stackoverflow.com/a/58913251/8764808 ลองดู


ขอบคุณ @Wale! คุณช่วยอธิบายคำตอบของคุณได้หรือไม่? ฉันไม่สนใจลิงก์ไปยังคำถามอื่น แต่ตัวดัดแปลงจำนวนมากที่นี่ทำให้รู้สึกไม่สบายใจเกี่ยวกับคำตอบการเชื่อมโยงข้ามแม้จะมี SO
Don P

ฉันคงรักจริง แต่ครั้งสุดท้ายที่ฉันลองทำแบบนั้นฉันถูกตำหนิเรื่องคำตอบที่ซ้ำกัน
Wale
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.