ইলেক্ট্রন অ্যাপে কনসোল.লগ () ব্যবহার করা


116

আমি কীভাবে আমার বৈদ্যুতিন অ্যাপ্লিকেশনটিতে কনসোলে ডেটা বা বার্তাগুলি লগ করতে পারি?

সত্যই এই মৌলিক হ্যালো ওয়ার্ল্ডটি ডিভাইস ডিফল্টরূপে খোলে, আমি ব্যবহার করতে অক্ষম 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 কাজ করে, তবে এটি যেখানে আপনি মূল প্রক্রিয়া থেকে বা রেন্ডারকারী প্রক্রিয়া থেকে কল করেছেন কিনা তার উপর নির্ভর করে।

যদি আপনি এটিকে উপস্থাপক প্রক্রিয়া (যেমন আপনার index.htmlফাইল থেকে অন্তর্ভুক্ত জাভাস্ক্রিপ্ট ) থেকে কল করেন তবে এটি ডিভাইস উইন্ডোতে লগ ইন হবে।

যদি আপনি এটিকে মূল প্রক্রিয়া (যেমন in main.js) থেকে কল করেন তবে এটি নোডের মতোই কাজ করবে - এটি টার্মিনাল উইন্ডোতে লগ ইন করবে। আপনি যদি টার্মিনালটি ব্যবহার করে আপনার ইলেক্ট্রন প্রক্রিয়াটি শুরু করে থাকেন তবে electron .আপনি console.logসেখানকার মূল প্রক্রিয়া থেকে আপনার কলগুলি দেখতে পাবেন ।


2
আমি কি console.log()রেন্ডারকারী প্রক্রিয়া থেকে প্রধান প্রক্রিয়া করতে পারি ?
ফান্দি সুসান্টো

1
@ ফ্যানডিসুসান্টো, আপনি আপনার মূল প্রক্রিয়াটিতে এবং তারপরে কনসোল.লগ () বার্তা প্রেরণের জন্য ipcRenderer মডিউলটি ব্যবহার করতে পারেন।
আর্থারসফ্রেয়ার

23
প্রোডাকশন মোডে কী হবে, কী হবে কনসোল.লগ () main মূল প্রক্রিয়াতে
জিমি ওবনিও অ্যাওবর

16
@ জিমিঅবনিওএবার একটি প্রযোজনা ইলেক্ট্রন অ্যাপ্লিকেশনটিতে একটি কনসোল সংযুক্ত করতে এবং আপনার টার্মিনালে কনসোল আউটপুট পেতে একটি টার্মিনালে নিম্নলিখিতটি চালান ./path/to/release/MyProgram.app/Contents/MacOS/MyProgram। এটি বাইনারি চালাবে MyProgramএবং আপনাকে console.logএকটি টার্মিনালে প্রক্রিয়া ইভেন্টগুলি দেখার অনুমতি দেবে ।
ডেটাউজার

কিভাবে আমি এখনও টার্মিনালে কাপড় লগ ইন করতে পারেন মাধ্যমে অ্যাপ্লিকেশান রিসেট পর app.relaunch()এবং app.exit(0)???
ওল্ডবয়

38

উইন্ডোতে আপনি পরিবেশের পরিবর্তনশীলও যুক্ত করতে পারেন:

ELECTRON_ENABLE_LOGGING=1

এটি আপনার টার্মিনালে কনসোল বার্তাগুলি আউটপুট দেবে।


এই পরিবেশের পরিবর্তনশীল সেট না হওয়া পর্যন্ত আমি কনসোলে কোনও বার্তা দেখতে পাইনি didn't
ডিভি কে

7
ডক্স বলে যে এ সেট করা উচিত trueএবং তা নির্ধারণের যে true, যা কি ওপি চায় না "কনসোলে Chrome এর অভ্যন্তরীণ লগিং কপি করে প্রিন্ট"।
পুশকিন

@ পুশকিন এটি ELECTRON_ENABLE_LOGGING=1পাশাপাশি কাজ করে । এবং ওপি যা চায়, তারপরে কী আছে? প্রভাবটি দেখতে নীচের টুকরোটি দেখুন।
x-yuri

ELECTRON_ENABLE_LOGGING = 1 কোন ফাইলটিতে যুক্ত হয়েছে?
স্থির_চলাচল

1
@ স্টিল_অলার্জনিং আপনি এটিকে পরিবেশের পরিবর্তনশীল হিসাবে সেট করেছেন। তাই উইন্ডোজ কমান্ড লাইন থেকেset ELECTRON_ENABLE_LOGGING=true
পুশকিন

30

রেন্ডারার প্রক্রিয়াটির ভিতরে থেকে কনসোলে লগইনের আরও একটি উপায় রয়েছে। এটি ইলেকট্রন দেওয়া, আপনি নোডের নেটিভ মডিউলগুলি অ্যাক্সেস করতে পারবেন। এটি consoleমডিউল অন্তর্ভুক্ত ।

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

যখন এই কোডটি রেন্ডারার প্রক্রিয়াটির অভ্যন্তর থেকে চালানো হয়, আপনি Hello World!টার্মিনালে পেয়ে যাবেন যেখান থেকে আপনি ইলেকট্রন চালিয়েছিলেন।

মডিউলটিতে আরও ডকুমেন্টেশনের জন্য 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(ডিজবীর উত্তর দেখুন)
রাফিনেস

আমি কোনও এক্সটেনশনের জন্য একটি পটভূমি স্ক্রিপ্টের মধ্যে ব্যবহার করার চেষ্টা করছি এবং এটি কেন কাজ করছে তা অস্পষ্ট। (ব্যাকগ্রাউন্ড স্ক্রিপ্টগুলি মূলত ব্যাকগ্রাউন্ড উইন্ডো হিসাবে লোড হয়)
নার্ফানেটর

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

3
যদিও এই কোডটি সমস্যা সমাধানে সহায়তা করতে পারে তবে এটি কেন এবং / বা কীভাবে প্রশ্নের উত্তর দেয় তা ব্যাখ্যা করে না । এই অতিরিক্ত প্রসঙ্গ সরবরাহ করা তার দীর্ঘমেয়াদী মানকে উল্লেখযোগ্যভাবে উন্নতি করবে। দয়া করে সম্পাদনা ব্যাখ্যা যোগ করার জন্য সহ সীমাবদ্ধতা এবং অনুমানের কি প্রয়োগ আপনার উত্তর।
টবি স্পিড

5

আপনি এনএমপি প্যাকেজটি ইলেক্ট্রন-লগ ব্যবহার করতে পারেন https://www.npmjs.com/package/electron-log

এটি আপনার ত্রুটি লগ করবে, সতর্ক করবে, তথ্য, ভার্বোস, ডিবাগ করবে, আপনার নেটিভ ওএস লগের নিরীহ আউটপুটগুলি।

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

এই কোডটি টার্মিনাল উইন্ডোতে কেবল একটি সাধারণ ডিবাগ বার্তা আউটপুট দেওয়ার জন্য দুর্দান্ত কাজ করে যা থেকে আপনি ইলেকট্রন অ্যাপ্লিকেশন চালু করেছিলেন এবং এটিই কনসোল.লগ এর শীর্ষে তৈরি build

এখানে 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

অ্যালেক্স ওয়ারেন যা লিখেছেন তা সবই সত্য। ইলেক্ট্রন কীভাবে শুরু হয় তা এখানে গুরুত্বপূর্ণ। আপনি যদি প্যাকেজ.জসন ফাইলে স্ট্যান্ডার্ড স্ক্রিপ্ট ব্যবহার করেন তবে এটি কার্যকর হবে না। এই 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 লগার.জেএস ফাইলটিতে, আপনি এখানে ব্যবহারের প্রকৃত বাস্তব দেখতে পাচ্ছেন।


জেএস কোড ইনজেকশনগুলি এড়াতে যদিও (JSON স্ট্রিং হিসাবে?) তথ্যের এনকোড করা দরকার।
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) রেন্ডার.জেএস

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

আউটপুট লজিক

  • দুটি প্রক্রিয়া এবং এর কনসোল.লগ আউটপুট:
    • main process= NodeJS process= এখানেElectron UI process
      • -> console.logমধ্যে main.jsইচ্ছার আউটপুট লগ এখানে
    • render process
      • -> console.logমধ্যে render.jsইচ্ছার আউটপুট লগ এখানে

স্ক্রিনশট উদাহরণ

  • DEBUG = বিকাশ মোড
    • চালান ./node_modules/.bin/electron .
  • উত্পাদন = রিলিজ মোড = এক্সএক্সএক্সএক্স.এপ প্যাক করে gedeletron-builder
    • চালান /path_to_your_packaged_mac_app/xxx.app/Contents/MacOS/yourBinaryExecutable
    • যোগ করা হয়েছে export ELECTRON_ENABLE_LOGGING=true, render.jsকনসোল.লগ টার্মিনালে ALSO আউটপুটmain process

1

একটি পুরানো থ্রেড উত্থাপনের জন্য দুঃখিত তবে এটি "কীভাবে টার্মিনালে কনসোল.লগ আউটপুট করবেন" (বা অনুরূপ অনুসন্ধানগুলি) এর শীর্ষ ফলাফল।

যে কেউ টার্মিনালে আউটপুট কী তার উপর আরও কিছুটা নিয়ন্ত্রণ পেতে চাইছেন আপনি ওয়েবকন্টেন্টস.অন ('কনসোল-বার্তা') এর মতো ব্যবহার করতে পারেন:

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

দেখা:

ওয়েবকন্টেন্টস ডকুমেন্টেশন

ব্রাউজার উইন্ডো ডক্সে ওয়েবসন্টেন্টস এন্ট্রি


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প্রধান ব্রাউজার উইন্ডোর ডেভেলপার টুলস প্যানেলের কনসোলে

একাধিক আরোগুলি গ্রহণ করার জন্য আপনার এই পদ্ধতিটি বাড়ানোর প্রয়োজন হতে পারে (এসএস 6 দ্বারা আপনি স্প্রেড অপারেটর দিয়ে এটি করতে পারেন)


1

ঠিক আছে, এটি 2019 এবং আমি বিশ্বাস করতে পারি না উপরের সমস্ত উত্তরে কেউ এই কৌশলটির কথা উল্লেখ করেনি। ঠিক আছে, তাই, সরাসরি থেকে সরাসরি ব্রাউজার কনসোলে লগইন সম্পর্কে কীভাবে? আমি আমার উত্তর এখানে সরবরাহ করেছি: https://stackoverflow.com/a/58913251/8764808 একবার দেখুন।


ধন্যবাদ @ ওয়াল! আপনার উত্তর সন্নিবেশ করতে আপত্তি করবেন? আমি অন্য প্রশ্নের লিঙ্কটিতে কিছু মনে করি না, তবে এখানকার প্রচুর মোডগুলি এসও দিয়ে ক্রস লিঙ্কিংয়ের উত্তরগুলি সম্পর্কে প্রসন্ন হন।
ডন পি

আমি আসলে পছন্দ করতাম, তবে আবারও শেষবারের মতো চেষ্টা করার পরে, সদৃশ উত্তরগুলির জন্য আমাকে তিরস্কার করা হয়েছিল।
ওয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.