সঠিক লাইন নম্বর সহ কনসোল.লগের জন্য একটি উপযুক্ত মোড়ক?


132

আমি এখন একটি অ্যাপ্লিকেশন বিকাশ করছি এবং একটি গ্লোবাল isDebugসুইচ রাখছি । আমি console.logআরও সুবিধাজনক ব্যবহারের জন্য মোড়ানো করতে চাই ।

//isDebug controls the entire site.
var isDebug = true;

//debug.js
function debug(msg, level){
    var Global = this;
    if(!(Global.isDebug && Global.console && Global.console.log)){
        return;
    }
    level = level||'info';
    Global.console.log(level + ': '+ msg);
}

//main.js
debug('Here is a msg.');

তারপরে আমি ফায়ারফক্স কনসোলে এই ফলাফলটি পাই।

info: Here is a msg.                       debug.js (line 8)

আমি যদি লাইন নম্বর দিয়ে লগ করতে চাই যেখানে debug()ডাকা হয় সেখানে info: Here is a msg. main.js (line 2)?


আপনি কোনও মোড়ক ফাংশনটির মাধ্যমে কিছু যুক্ত করার পরিবর্তে console.logতথ্য, console.warnসতর্কতা এবং console.errorত্রুটির জন্য ব্যবহার করতে পারেন console.log
অ্যালভিন ওয়াং

2
@ অ্যালভিনওয়ং হ্যাঁ আমি এটি জানি, তবে সমস্যাটি হ'ল আমার একটি গ্লোবাল ডিবাগ সুইচ দরকার, যা consoleএটি ব্যবহার করা দরকার কিনা তা নিয়ন্ত্রণ করে । এই ধরনের লক্ষ্য অর্জনের জন্য, একটি মোড়ককে একমাত্র উপায় বলে মনে হচ্ছে?
রুফাস

এর জন্য Google Chrome দেখতে stackoverflow.com/a/25729203/1429301 আপনার যদি প্যাটার্ন debug.js হবে
Frison আলেকজান্ডার

উত্তর:


117

এটি একটি পুরানো প্রশ্ন এবং প্রদত্ত সমস্ত উত্তর অত্যধিক হ্যাকি, মেজর ক্রস ব্রাউজার সংক্রান্ত সমস্যা রয়েছে এবং দুর্দান্ত কিছু সরবরাহ করবেন না। এই সমাধানটি প্রতিটি ব্রাউজারে কাজ করে এবং সমস্ত কনসোল ডেটা ঠিক যেমনটি করা উচিত তেমন রিপোর্ট করে। কোনও হ্যাকের প্রয়োজন নেই এবং কোডের একটি লাইন কোডপেনটি দেখুন

var debug = console.log.bind(window.console)

এই মত স্যুইচ তৈরি করুন:

isDebug = true // toggle this to turn on / off for global controll

if (isDebug) var debug = console.log.bind(window.console)
else var debug = function(){}

তারপরে নীচে কেবল কল করুন:

debug('This is happening.')

আপনি এই জাতীয় স্যুইচ সহ কনসোল.লগও নিতে পারেন:

if (!isDebug) console.log = function(){}

যদি আপনি এটির সাথে দরকারী কিছু করতে চান .. আপনি সমস্ত কনসোল পদ্ধতি যুক্ত করতে পারেন এবং এটিকে পুনরায় ব্যবহারযোগ্য ফাংশনে গুটিয়ে রাখতে পারেন যা কেবল বিশ্বব্যাপী নিয়ন্ত্রণই দেয় না, শ্রেণিক স্তরও দেয়:

var Debugger = function(gState, klass) {

  this.debug = {}

  if (gState && klass.isDebug) {
    for (var m in console)
      if (typeof console[m] == 'function')
        this.debug[m] = console[m].bind(window.console, klass.toString()+": ")
  }else{
    for (var m in console)
      if (typeof console[m] == 'function')
        this.debug[m] = function(){}
  }
  return this.debug
}

isDebug = true //global debug state

debug = Debugger(isDebug, this)

debug.log('Hello log!')
debug.trace('Hello trace!')

এখন আপনি এটি আপনার ক্লাসে যুক্ত করতে পারেন:

var MyClass = function() {
  this.isDebug = true //local state
  this.debug = Debugger(isDebug, this)
  this.debug.warn('It works in classses')
}

16
আমি ভুল হলে আমাকে সংশোধন করুন, তবে এটি আপনাকে কোনও অতিরিক্ত কার্যকারিতা যুক্ত করার অনুমতি দেয় না, সঠিক? আপনি মূলত কেবল কনসোল অবজেক্টকেই এলিয়াস করছেন? একটি অশোধিত উদাহরণ - প্রতিটি ডিবাগ.লগ () এর জন্য ইভেন্টটি দুবার কনসোল.লগ () করার কোন উপায় নেই?
এবি ক্যারল

3
@ ABCarrol আপনি দুটি কলের সাথে থাকা console.logএকটি কাস্টম log()ফাংশনকে জড়িত করে দু'বার পেরেছিলেন console.log, তবে লাইন নম্বরগুলি সেই লাইনের প্রতিফলন করবে যা console.logআসলে অবস্থান করে, যেখানে debug.logডাকা হয় না। তবে আপনি গতিশীল উপসর্গ / প্রত্যয় ইত্যাদি যুক্ত করতে পারেন .. লাইন নম্বর ইস্যুটির জন্য ক্ষতিপূরণ দেওয়ার বিভিন্ন উপায় রয়েছে তবে আমার মনে হয় এমন অন্য একটি প্রশ্ন ts উদাহরণস্বরূপ এই প্রকল্পটি দেখুন: github.com/arctelix/iDebugConsole/blob/master/README.md
arctelix

2
এই পদ্ধতিটি ফায়ারফক্সে 47 থেকে 49 সংখ্যার সংস্করণ পর্যন্ত কাজ করে না। এবং শুধুমাত্র 50.0a2 সংস্করণে স্থির করা হয়েছিল। ঠিক আছে FF50 2 সপ্তাহের মধ্যে মুক্তি পাবে, তবে কেন এটি কাজ করছে না তা বুঝতে আমি কয়েক ঘন্টা ব্যয় করি। সুতরাং আমি মনে করি এই তথ্য কারও পক্ষে সহায়ক হতে পারে। লিঙ্ক
ভ্লাদিমির লিউবিমভ

আমি বিশ্বাস করি যে @AbCarrol বলতে যা বোঝায় তা হ'ল দুরত্বের অভ্যন্তরের সমস্ত কিছুই রানটাইম ব্যবহার করা যাবে না। অন্য উদাহরণের জন্য, গ্লোবাল রাষ্ট্রটি কেবল তাত্ক্ষণিকভাবে সংজ্ঞায়িত করা যায়, সুতরাং আপনি যদি পরে পরিবর্তিত this.isDebugহন তবে falseতাতে কিছু আসে যায় না। আমি জানি না এটির কোনও উপায় আছে কিনা, সম্ভবত এটি নকশা দ্বারা। সেই দিক থেকে isDebugএটি বেশ বিভ্রান্তিকর varএবং এর constপরিবর্তে হওয়া উচিত ।
ক্রেগক্স

2
এটি প্রশ্নের উত্তর দেয় না "আমি যদি লাইন নম্বর দিয়ে লগ করতে চাই যেখানে ডিবাগ () কল হয়?"
টেকনোমেজ

24

আমি @ ফ্রেড্রিকের উত্তর পছন্দ করেছি , তাই আমি এটিকে অন্য একটি উত্তর দিয়ে গুটিয়েছিলাম যা ওয়েবকিট স্ট্যাকট্রেসকে বিভক্ত করে , এবং এটি @ পলিরিশের নিরাপদ কনসোল.লগ র্যাপারের সাথে একীভূত করেছিলাম । filename:lineএকটি "বিশেষ অবজেক্ট" এর "মানক" করে তোলে যাতে এটি দাঁড়িয়ে থাকে এবং বেশিরভাগই এফএফ এবং ক্রোমে একই দেখা যায়।

ফিডলে পরীক্ষা করা: http://jsfiddle.net/drzaus/pWe6W/

_log = (function (undefined) {
    var Log = Error; // does this do anything?  proper inheritance...?
    Log.prototype.write = function (args) {
        /// <summary>
        /// Paulirish-like console.log wrapper.  Includes stack trace via @fredrik SO suggestion (see remarks for sources).
        /// </summary>
        /// <param name="args" type="Array">list of details to log, as provided by `arguments`</param>
        /// <remarks>Includes line numbers by calling Error object -- see
        /// * http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
        /// * /programming/13815640/a-proper-wrapper-for-console-log-with-correct-line-number
        /// * https://stackoverflow.com/a/3806596/1037948
        /// </remarks>

        // via @fredrik SO trace suggestion; wrapping in special construct so it stands out
        var suffix = {
            "@": (this.lineNumber
                    ? this.fileName + ':' + this.lineNumber + ":1" // add arbitrary column value for chrome linking
                    : extractLineNumberFromStack(this.stack)
            )
        };

        args = args.concat([suffix]);
        // via @paulirish console wrapper
        if (console && console.log) {
            if (console.log.apply) { console.log.apply(console, args); } else { console.log(args); } // nicer display in some browsers
        }
    };
    var extractLineNumberFromStack = function (stack) {
        /// <summary>
        /// Get the line/filename detail from a Webkit stack trace.  See https://stackoverflow.com/a/3806596/1037948
        /// </summary>
        /// <param name="stack" type="String">the stack string</param>

        if(!stack) return '?'; // fix undefined issue reported by @sigod

        // correct line number according to how Log().write implemented
        var line = stack.split('\n')[2];
        // fix for various display text
        line = (line.indexOf(' (') >= 0
            ? line.split(' (')[1].substring(0, line.length - 1)
            : line.split('at ')[1]
            );
        return line;
    };

    return function (params) {
        /// <summary>
        /// Paulirish-like console.log wrapper
        /// </summary>
        /// <param name="params" type="[...]">list your logging parameters</param>

        // only if explicitly true somewhere
        if (typeof DEBUGMODE === typeof undefined || !DEBUGMODE) return;

        // call handler extension which provides stack trace
        Log().write(Array.prototype.slice.call(arguments, 0)); // turn into proper array
    };//--  fn  returned

})();//--- _log

এটি নোডেও কাজ করে এবং আপনি এটি দিয়ে এটি পরীক্ষা করতে পারেন:

// no debug mode
_log('this should not appear');

// turn it on
DEBUGMODE = true;

_log('you should', 'see this', {a:1, b:2, c:3});
console.log('--- regular log ---');
_log('you should', 'also see this', {a:4, b:8, c:16});

// turn it off
DEBUGMODE = false;

_log('disabled, should not appear');
console.log('--- regular log2 ---');

অতিরিক্ত জন্য অ্যাকাউন্টে একটি সামান্য আরো উন্নত উত্তর consoleমত পদ্ধতি warn, error-, ইত্যাদি stackoverflow.com/a/14842659/1037948
drzaus

1
var line = stack.split('\n')[2];-'undefined' is not an object
সিগড

@ সিগড - সম্ভবত ব্রাউজারের উপর নির্ভর করে, বা আমি এটি 2 বছর আগে লিখেছি এবং ব্রাউজারটি পরিবর্তন হয়েছে। আপনার পরিস্থিতি কি?
ড্রাজস

1
আমার এক সহকর্মী আমাদের প্রকল্পে আপনার কোডটি অনুলিপি করেছেন। এটি IE11 এবং সাফারি 5 এ সাইটটি ভেঙে দিয়েছে this এই ব্রাউজারগুলির অন্যান্য সংস্করণ সম্পর্কে নিশ্চিত নয়। সম্ভবত আপনি ভবিষ্যতের অনুলিপি-পাস্টারদের জন্য একটি চেক যুক্ত করবেন?
সিগড

1
@ সিগড এখন কি হবে? if(!stack) return '?'ব্যর্থ হওয়া পদ্ধতিতে যুক্ত হয়েছে, যেখানে ডাকা হয়েছে তার পরিবর্তে (সুতরাং কেউ যদি পদ্ধতিটি নিজে ব্যবহার করেন তবে তারাও "সুরক্ষিত")
ড্রাজাস

18

আপনি কিছু চতুর ব্যবহারের সাথে লাইন নম্বর বজায় রাখতে এবং লগের আউটপুট আউটপুট করতে পারেন Function.prototype.bind:

function setDebug(isDebug) {
  if (window.isDebug) {
    window.debug = window.console.log.bind(window.console, '%s: %s');
  } else {
    window.debug = function() {};
  }
}

setDebug(true);

// ...

debug('level', 'This is my message.'); // --> level: This is my message. (line X)

এটিকে আরও একধাপ এগিয়ে নিয়ে যাওয়া, আপনি consoleত্রুটি / সতর্কতা / তথ্যের পার্থক্যগুলি ব্যবহার করতে পারেন এবং এখনও কাস্টম স্তরের থাকতে পারেন। চেষ্টা করে দেখুন!

function setDebug(isDebug) {
  if (isDebug) {
    window.debug = {
      log: window.console.log.bind(window.console, '%s: %s'),
      error: window.console.error.bind(window.console, 'error: %s'),
      info: window.console.info.bind(window.console, 'info: %s'),
      warn: window.console.warn.bind(window.console, 'warn: %s')
    };
  } else {
    var __no_op = function() {};

    window.debug = {
      log: __no_op,
      error: __no_op,
      warn: __no_op,
      info: __no_op
    }
  }
}

setDebug(true);

// ...

debug.log('wat', 'Yay custom levels.'); // -> wat: Yay custom levels.    (line X)
debug.info('This is info.');            // -> info: This is info.        (line Y)
debug.error('Bad stuff happened.');     // -> error: Bad stuff happened. (line Z)

1
আমি স্বয়ংক্রিয়ভাবে থেকে আউটপুট প্রিফিক্স কিছুদিনের জন্য চেষ্টা করছি এখন console.debug(...)সঙ্গে function nameএবং argumentsযে কাজ করতে কিভাবে কোনো চিন্তা -
ড্যানিয়েল সোকলভস্কি

3
আমি কনসোল মোড়ক / শিমস / ইত্যাদির ভিড়ের দিকে তাকিয়ে আছি। এবং এটিই আমি প্রথম এসেছি যা আউটপুট কাস্টমাইজ করার সাথে লাইন নম্বর সংরক্ষণের সাথে সংযুক্ত করে। এটি এই বিষয়টির একটি চতুর ব্যবহার যা .bind আপনার জন্য কিছু কারি করায়, আপনি প্রসঙ্গ ছাড়াও এক বা একাধিক যুক্তি বাঁধতে পারেন । আপনি এটিকে আরও একধাপ এগিয়ে নিয়ে যেতে পারেন এবং একটি টু স্ট্রিং পদ্ধতিতে একটি নুপ ফাংশনটি পাস করতে পারেন যা লগ পদ্ধতিতে যখন ডাকা হয় তখন কোড চালাতে পারে ! এই jsfiddle
স্যাম হাসলার

2
সম্ভবত সমস্ত ব্রাউজারে নয় (এটি সন্ধান করেননি), তবে ক্রোমের %sসাথে প্রতিস্থাপনের ফলে %oআপনি যেভাবে প্রত্যাশা করবেন সেভাবে প্যারামিটারগুলি মুদ্রণ করা হবে (বস্তুগুলি প্রসারযোগ্য, সংখ্যা এবং স্ট্রিংগুলি রঙিন ইত্যাদি)।
Anson

এই সমাধান ভালবাসা। আমি কয়েকটি পরিবর্তন করেছি যা আমার আবেদনের জন্য আরও ভাল কাজ করে, তবে এর বেশিরভাগ অংশ এখনও অক্ষত এবং সুন্দরভাবে চলছে। ধন্যবাদ
ওয়ার্ড

9

থেকে: জাভাস্ক্রিপ্ট কলার ফাংশন লাইন নম্বর কীভাবে পাবেন? কীভাবে জাভাস্ক্রিপ্ট কলার উত্স URL পাবেন? Errorবস্তুর একটি লাইন সংখ্যা সম্পত্তি (হ মধ্যে) আছে। সুতরাং এর মতো কিছু কাজ করা উচিত:

var err = new Error();
Global.console.log(level + ': '+ msg + 'file: ' + err.fileName + ' line:' + err.lineNumber);

ওয়েবকিট ব্রাউজারে আপনার কাছে err.stackএটি একটি স্ট্রিং যা বর্তমান কল স্ট্যাকের প্রতিনিধিত্ব করে। এটি বর্তমান লাইন নম্বর এবং আরও তথ্য প্রদর্শন করবে।

হালনাগাদ

সঠিক লিনেনবারটি পেতে আপনাকে এই লাইনে ত্রুটিটি চালিত করতে হবে। কিছুটা এইরকম:

var Log = Error;
Log.prototype.write = function () {
    var args = Array.prototype.slice.call(arguments, 0),
        suffix = this.lineNumber ? 'line: '  + this.lineNumber : 'stack: ' + this.stack;

    console.log.apply(console, args.concat([suffix]));
};

var a = Log().write('monkey' + 1, 'test: ' + 2);

var b = Log().write('hello' + 3, 'test: ' + 4);

1
new Error();এটি যেখানে সঞ্চালিত হয় সেই প্রসঙ্গটি আমাকে দেয়, আমি যদি এটিতে debug.jsরাখি তবে আমি পেয়ে যাব info: Here is a msg. file: http://localhost/js/debug.js line:7
রুফাস

1
কিসের কথা Log = Error? আপনি এখনও ত্রুটি শ্রেণি পরিবর্তন করছেন, তাই না?
drzaus

একটি দম্পতি অন্যদের সাথে আপনার উত্তর সম্মিলিত - নিচে দেখুন stackoverflow.com/a/14841411/1037948
drzaus

8

লাইন নম্বর রাখার একটি উপায় এখানে: https://gist.github.com/bgrins/5108712 । এটি কমবেশি এটিতে সিদ্ধ হয়:

if (Function.prototype.bind) {
    window.log = Function.prototype.bind.call(console.log, console);
}
else {
    window.log = function() { 
        Function.prototype.apply.call(console.log, console, arguments);
    };
}

আপনি এটি দিয়ে মোড়ানো করতে পারেন এবং আপনি ডিবাগিং না করলে isDebugসেট window.logকরতে function() { }পারেন।


7

আপনি আপনার ডিবাগ পদ্ধতিতে লাইন নম্বরটি পাস করতে পারেন:

//main.js
debug('Here is a msg.', (new Error).lineNumber);

এখানে, (new Error).lineNumberআপনাকে আপনার javascriptকোডে বর্তমান লাইন নম্বর দেবে ।


2
একটু ভার্জোজ, তাই না?
রুফাস

2
আমি মনে করি আপনার প্রশ্নের উত্তর দেওয়ার জন্য এটি যথেষ্ট। :)
সুবোধ

1
লাইন নম্বর নম্বরটি মানসম্মত নয়, এবং এখনই কেবল ফায়ারফক্সে কাজ করে, এখানে দেখুন
ম্যাথিয়াস

6

ক্রোম ডিভলটুলস আপনাকে ব্ল্যাকবক্সিংয়ের মাধ্যমে এটি অর্জন করতে দেয় । আপনি কনসোল.লগ র‍্যাপার তৈরি করতে পারেন যার পার্শ্ব প্রতিক্রিয়া থাকতে পারে, অন্যান্য ক্রিয়াকলাপ ইত্যাদি কল করতে পারে এবং এখনও রেপার ফাংশন বলে লাইন নম্বরটি ধরে রাখতে পারে।

একটি পৃথক ফাইলে কেবল একটি ছোট কনসোল.লগ র্যাপার রাখুন eg

(function() {
    var consolelog = console.log
    console.log = function() {
        // you may do something with side effects here.
        // log to a remote server, whatever you want. here
        // for example we append the log message to the DOM
        var p = document.createElement('p')
        var args = Array.prototype.slice.apply(arguments)
        p.innerText = JSON.stringify(args)
        document.body.appendChild(p)

        // call the original console.log function
        consolelog.apply(console,arguments)
    }
})()

লগ-ব্ল্যাকবক্স.জেএস এর মতো কিছু নাম দিন

তারপরে ক্রোম ডিভলটুলস সেটিংসে যান এবং "ব্ল্যাকবক্সিং" বিভাগটি সন্ধান করুন, আপনি যে ফাইল নামটি ব্ল্যাকবক্স করতে চান তার জন্য একটি প্যাটার্ন যুক্ত করুন, এই ক্ষেত্রে লগ-ব্ল্যাকবক্স.জেএস


দ্রষ্টব্য: নিশ্চিত করুন যে আপনার কাছে কোনও ফাইল নেই যা আপনি একই ফাইলের স্ট্যাক ট্রেসে প্রদর্শন করতে চান, কারণ এটি ট্রেস থেকেও সরানো হবে।
jamesthollowell

6

গ্রহণযোগ্য উত্তরটি (কনসোল.লগ / ত্রুটি / ইত্যাদির সাথে আবদ্ধ) একত্রিত করার জন্য একটি সহজ সমাধান আমি খুঁজে পেয়েছি যা আসলে লগ হয়েছে তা ফিল্টার করার জন্য বাইরের কিছু যুক্তির সাথে।

// or window.log = {...}
var log = {
  ASSERT: 1, ERROR: 2, WARN: 3, INFO: 4, DEBUG: 5, VERBOSE: 6,
  set level(level) {
    if (level >= this.ASSERT) this.a = console.assert.bind(window.console);
    else this.a = function() {};
    if (level >= this.ERROR) this.e = console.error.bind(window.console);
    else this.e = function() {};
    if (level >= this.WARN) this.w = console.warn.bind(window.console);
    else this.w = function() {};
    if (level >= this.INFO) this.i = console.info.bind(window.console);
    else this.i = function() {};
    if (level >= this.DEBUG) this.d = console.debug.bind(window.console);
    else this.d = function() {};
    if (level >= this.VERBOSE) this.v = console.log.bind(window.console);
    else this.v = function() {};
    this.loggingLevel = level;
  },
  get level() { return this.loggingLevel; }
};
log.level = log.DEBUG;

ব্যবহার:

log.e('Error doing the thing!', e); // console.error
log.w('Bonus feature failed to load.'); // console.warn
log.i('Signed in.'); // console.info
log.d('Is this working as expected?'); // console.debug
log.v('Old debug messages, output dominating messages'); // console.log; ignored because `log.level` is set to `DEBUG`
log.a(someVar == 2) // console.assert
  • console.assertশর্তযুক্ত লগিং ব্যবহার করে তা নোট করুন ।
  • আপনার ব্রাউজারের ডিভাইসগুলি সমস্ত বার্তার স্তর দেখায় তা নিশ্চিত করুন!

কারণ এটি কোনও লাইন নম্বর দেয় না বা লগের স্তরটি দেখায় এমন কাজের উদাহরণ দেয় না।
not2qubit

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

4

আপনি যদি ডিবাগটি ব্যবহৃত হয় এবং সঠিক লাইন নম্বর আছে কিনা তা আপনি যদি নিয়ন্ত্রণ করতে চান তবে পরিবর্তে আপনি এটি করতে পারেন:

if(isDebug && window.console && console.log && console.warn && console.error){
    window.debug = {
        'log': window.console.log,
        'warn': window.console.warn,
        'error': window.console.error
    };
}else{
    window.debug = {
        'log': function(){},
        'warn': function(){},
        'error': function(){}
    };
}

আপনার যখন ডিবাগ অ্যাক্সেস প্রয়োজন, আপনি এটি করতে পারেন:

debug.log("log");
debug.warn("warn");
debug.error("error");

তাহলে isDebug == true, লাইন নম্বর এবং কনসোল দেখানো ফাইলের নাম, সঠিক হতে হবে কারণ debug.logইত্যাদি আসলে একজন ওরফে হয় console.logইত্যাদি

যদি isDebug == false, কোনও ডিবাগ বার্তাগুলি প্রদর্শিত না হয়, কারণ debug.logইত্যাদি কেবল কিছুই করে না (একটি খালি ফাংশন)।

আপনি ইতিমধ্যে জানেন যে একটি মোড়ক ফাংশন লাইন নম্বর এবং ফাইলের নামগুলি জগাখিচুড়ি করবে, সুতরাং মোড়কের ফাংশনগুলি ব্যবহার করা রোধ করা ভাল ধারণা।


দুর্দান্ত, আমার ক্রম isDebug = trueএবং ক্রম সম্পর্কে সতর্ক হওয়া দরকার debug.js, তবে এই উত্তরটি কার্যকর হয়!
রুফাস

3
window.debug = window.consoleকিছুটা ক্লিনার হতে হবে
ফ্রেডরিক

@ ফ্রেডরিক তারপরে আমাকে সমস্ত সদস্যের কাজগুলি "প্রয়োগ" করতে হবে যদি তবে isDebug == false। : {
অ্যালভিন ওয়াং

@ অ্যালভিনওয়ং আমি যদি কেবল মেনাট করি তবে isDebug===true। বা এটির
ফ্রেডরিক

4

স্ট্যাক ট্রেস সলিউশনগুলি লাইন নম্বরটি প্রদর্শন করে তবে উত্সে যেতে ক্লিক করতে দেয় না যা একটি বড় সমস্যা। এই আচরণটি রাখার একমাত্র সমাধান হ'ল আসল ফাংশনটির সাথে আবদ্ধ

বাইন্ডিং মধ্যবর্তী যুক্তিকে অন্তর্ভুক্ত করতে বাধা দেয়, কারণ এই যুক্তিটি লাইন সংখ্যার সাথে গোলমাল করবে। তবে সীমাবদ্ধ ফাংশনগুলির নতুন সংজ্ঞা দিয়ে এবং কনসোল স্ট্রিং প্রতিস্থাপনের সাথে খেলে , কিছু অতিরিক্ত আচরণ এখনও সম্ভব।

এই সংক্ষিপ্তসারটি একটি নমনীয় লগিং ফ্রেমওয়ার্ক দেখায় যা মডিউল, লগ স্তর, ফর্ম্যাট এবং 34 টি লাইনে সঠিক ক্লিকযোগ্য লাইন নম্বর সরবরাহ করে। এটি আপনার নিজস্ব প্রয়োজনের ভিত্তি বা অনুপ্রেরণা হিসাবে ব্যবহার করুন।

var log = Logger.get("module").level(Logger.WARN);
log.error("An error has occured", errorObject);
log("Always show this.");

সম্পাদনা করুন: সংক্ষিপ্তসার নীচে অন্তর্ভুক্ত

/*
 * Copyright 2016, Matthieu Dumas
 * This work is licensed under the Creative Commons Attribution 4.0 International License.
 * To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/
 */

/* Usage : 
 * var log = Logger.get("myModule") // .level(Logger.ALL) implicit
 * log.info("always a string as first argument", then, other, stuff)
 * log.level(Logger.WARN) // or ALL, DEBUG, INFO, WARN, ERROR, OFF
 * log.debug("does not show")
 * log("but this does because direct call on logger is not filtered by level")
 */
var Logger = (function() {
    var levels = {
        ALL:100,
        DEBUG:100,
        INFO:200,
        WARN:300,
        ERROR:400,
        OFF:500
    };
    var loggerCache = {};
    var cons = window.console;
    var noop = function() {};
    var level = function(level) {
        this.error = level<=levels.ERROR ? cons.error.bind(cons, "["+this.id+"] - ERROR - %s") : noop;
        this.warn = level<=levels.WARN ? cons.warn.bind(cons, "["+this.id+"] - WARN - %s") : noop;
        this.info = level<=levels.INFO ? cons.info.bind(cons, "["+this.id+"] - INFO - %s") : noop;
        this.debug = level<=levels.DEBUG ? cons.log.bind(cons, "["+this.id+"] - DEBUG - %s") : noop;
        this.log = cons.log.bind(cons, "["+this.id+"] %s");
        return this;
    };
    levels.get = function(id) {
        var res = loggerCache[id];
        if (!res) {
            var ctx = {id:id,level:level}; // create a context
            ctx.level(Logger.ALL); // apply level
            res = ctx.log; // extract the log function, copy context to it and returns it
            for (var prop in ctx)
                res[prop] = ctx[prop];
            loggerCache[id] = res;
        }
        return res;
    };
    return levels; // return levels augmented with "get"
})();


এই উত্তরটিতে কেবলমাত্র 3 টি উপাখ্যান রয়েছে তবে পৃষ্ঠার অন্য কোনও তুলনায় অবিশ্বাস্যরূপে আরও সমৃদ্ধ এবং পরিষ্কার
টম

যাইহোক, দেখে মনে হচ্ছে সমস্ত দরকারী অংশগুলি একটি বাহ্যিক সংক্ষেপে রয়েছে।
রায়ান দ্য লিচ

3

বাইন্ড সহ ধারণাটি Function.prototype.bindউজ্জ্বল। আপনি এনপিএম লাইব্রেরি লাইন- লগারও ব্যবহার করতে পারেন । এটি উত্স উত্স ফাইলগুলি দেখায়:

আপনার প্রকল্পে একবার লগার তৈরি করুন:

var LoggerFactory = require('lines-logger').LoggerFactory;
var loggerFactory = new LoggerFactory();
var logger = loggerFactory.getLoggerColor('global', '#753e01');

লগগুলি মুদ্রণ করুন:

logger.log('Hello world!')();

এখানে চিত্র বর্ণনা লিখুন


2

consoleআউটপুটটিতে কোনও ফাইলের নাম এবং লাইন নম্বর বা অন্যান্য স্ট্যাক ট্রেস তথ্য যুক্ত করার সময় আপনার বিদ্যমান লগিং স্টেটমেন্টগুলি রাখার একটি উপায় :

(function () {
  'use strict';
  var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
  var isChrome = !!window.chrome && !!window.chrome.webstore;
  var isIE = /*@cc_on!@*/false || !!document.documentMode;
  var isEdge = !isIE && !!window.StyleMedia;
  var isPhantom = (/PhantomJS/).test(navigator.userAgent);
  Object.defineProperties(console, ['log', 'info', 'warn', 'error'].reduce(function (props, method) {
    var _consoleMethod = console[method].bind(console);
    props[method] = {
      value: function MyError () {
        var stackPos = isOpera || isChrome ? 2 : 1;
        var err = new Error();
        if (isIE || isEdge || isPhantom) { // Untested in Edge
          try { // Stack not yet defined until thrown per https://docs.microsoft.com/en-us/scripting/javascript/reference/stack-property-error-javascript
            throw err;
          } catch (e) {
            err = e;
          }
          stackPos = isPhantom ? 1 : 2;
        }

        var a = arguments;
        if (err.stack) {
          var st = err.stack.split('\n')[stackPos]; // We could utilize the whole stack after the 0th index
          var argEnd = a.length - 1;
          [].slice.call(a).reverse().some(function(arg, i) {
            var pos = argEnd - i;
            if (typeof a[pos] !== 'string') {
              return false;
            }
            if (typeof a[0] === 'string' && a[0].indexOf('%') > -1) { pos = 0 } // If formatting
            a[pos] += ' \u00a0 (' + st.slice(0, st.lastIndexOf(':')) // Strip out character count
              .slice(st.lastIndexOf('/') + 1) + ')'; // Leave only path and line (which also avoids ":" changing Safari console formatting)
            return true;
          });
        }
        return _consoleMethod.apply(null, a);
      }
    };
    return props;
  }, {}));
}());

তারপরে এটি ব্যবহার করুন:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <script src="console-log.js"></script>
</head>
<body>
  <script>
  function a () {
    console.log('xyz'); // xyz   (console-log.html:10)
  }
  console.info('abc'); // abc   (console-log.html:12)
  console.log('%cdef', "color:red;"); // (IN RED:) // def   (console-log.html:13)
  a();
  console.warn('uuu'); // uuu   (console-log.html:15)
  console.error('yyy'); // yyy   (console-log.html:16)
  </script>
</body>
</html>

এটি ফায়ারফক্স, অপেরা, সাফারি, ক্রোম এবং আইই 10 তে কাজ করে (এখনও আই 11 বা এজতে পরীক্ষা করা হয়নি)।


দুর্দান্ত কাজ, তবে এখনও আমার যা প্রয়োজন তা 100% নয়। কনসোল-ভিউয়ের ডানদিকে ফাইল-নাম এবং লাইন-নম্বর তথ্য থাকতে চাই, যেখানে এটি উত্সটি খোলার জন্য ক্লিক করা যেতে পারে। এই সমাধানটি বার্তার অংশ হিসাবে এই তথ্যটি দেখায় (এর মতো my test log message (myscript.js:42) VM167 mypage.html:15:), যা পড়া ভাল নয় তবে এটি লিঙ্কযুক্ত নয়। এখনও ভাল কাজ এইভাবে একটি উত্সাহ।
ফ্রেডেরিক লাইটেনবার্গার

হ্যাঁ, এটি আদর্শ হতে পারে, আফসাইক, কনসোলে প্রদর্শিত ফাইলের লিঙ্কটি ফাঁকি দেওয়ার কোনও উপায় নেই ...
ব্রেট জামির

: @BrettZamir এখানে এই কোড সম্পর্কে একটি প্রশ্ন পোস্ট stackoverflow.com/questions/52618368/...
Mahks

1
//isDebug controls the entire site.
var isDebug = true;

//debug.js
function debug(msg, level){
    var Global = this;
    if(!(Global.isDebug && Global.console && Global.console.log)){
        return;
    }
    level = level||'info';
    return 'console.log(\'' + level + ': '+ JSON.stringify(msg) + '\')';
}

//main.js
eval(debug('Here is a msg.'));

এই আমাকে দেবে info: "Here is a msg." main.js(line:2)

কিন্তু অতিরিক্ত evalপ্রয়োজন, করুণা।


2
alভাল ইভিল! সুতরাং প্রতিটি মন্দ।
ফ্রেডরিক

1

Http://www.briangrinstead.com/blog/console-log-helper-function থেকে কোড :

// Full version of `log` that:
//  * Prevents errors on console methods when no console present.
//  * Exposes a global 'log' function that preserves line numbering and formatting.
(function () {
  var method;
  var noop = function () { };
  var methods = [
      'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
      'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
      'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
      'timeStamp', 'trace', 'warn'
  ];
  var length = methods.length;
  var console = (window.console = window.console || {});

  while (length--) {
    method = methods[length];

    // Only stub undefined methods.
    if (!console[method]) {
        console[method] = noop;
    }
  }


  if (Function.prototype.bind) {
    window.log = Function.prototype.bind.call(console.log, console);
  }
  else {
    window.log = function() { 
      Function.prototype.apply.call(console.log, console, arguments);
    };
  }
})();

var a = {b:1};
var d = "test";
log(a, d);

এই মূল লাইন সংখ্যা যেখানে দেন বলে মনে হয় না logথেকে বলা হয়
ragamufin

আমি প্রায় নিশ্চিত যে পরীক্ষার সময় এটি কার্যকর হয়েছিল তবে আমি একই পৃষ্ঠা থেকে কোডটি "পূর্ণ" সংস্করণ দিয়ে প্রতিস্থাপন করেছি। ক্রোম 45. অন্তত এ কাজ করেছেন
টিমো Kähkönen

বুঝতে পারছিল না। আপনার পরিবর্তিত পরিবর্তনগুলির সাথে এটি অন্যান্য উত্তর এবং কাজের কয়েকটির মতোই মূলত একই। আমি আপনার আগের কোডটি সম্পর্কে মাত্র কৌতূহল ছিলাম কারণ আপনি শেষে আবেদন করেছিলেন যা এটির জন্য আমার আরও আকর্ষণীয় সম্ভাবনা উত্থাপন করেছিল তবে এটি যেহেতু আমি লাইন নম্বরটি দেখায়নি আমি আবার স্কোয়ার একটিতে ফিরে এসেছি। ধন্যবাদ যদিও!
রাগামুফিন

1

আমি ইদানীং এই সমস্যাটি দেখছি। লগিং নিয়ন্ত্রণ করতে খুব সোজা কিছু এগিয়ে দরকার, তবে লাইন সংখ্যা ধরে রাখতেও। আমার সমাধান কোডে মার্জিত হিসাবে দেখায় না, তবে আমার জন্য প্রয়োজনীয় যা সরবরাহ করে। যদি কেউ ক্লোজার এবং ধরে রাখার ক্ষেত্রে যথেষ্ট যত্নশীল হয়।

আমি অ্যাপ্লিকেশনটির শুরুতে একটি ছোট মোড়ক যুক্ত করেছি:

window.log = {
    log_level: 5,
    d: function (level, cb) {
        if (level < this.log_level) {
            cb();
        }
    }
};

যাতে পরে আমি কেবল এটি করতে পারি:

log.d(3, function(){console.log("file loaded: utils.js");});

আমি এটি ফায়ারফক্স এবং ক্রোমের পরীক্ষা করে দেখেছি এবং উভয় ব্রাউজারই লক্ষ্য হিসাবে কনসোল লগ দেখায়। আপনি যদি এটি পূরণ করেন তবে আপনি সর্বদা 'd' পদ্ধতিটি প্রসারিত করতে এবং এটিতে অন্যান্য পরামিতিগুলি পাস করতে পারেন, যাতে এটি কিছু অতিরিক্ত লগিং করতে পারে।

লগিংয়ের জন্য কোডের কুৎসিত লাইন বাদে এখনও আমার পদ্ধতির জন্য কোনও গুরুতর ত্রুটি খুঁজে পাওয়া যায় নি।


1

window.line = function () {
    var error = new Error(''),
        brower = {
            ie: !-[1,], // !!window.ActiveXObject || "ActiveXObject" in window
            opera: ~window.navigator.userAgent.indexOf("Opera"),
            firefox: ~window.navigator.userAgent.indexOf("Firefox"),
            chrome: ~window.navigator.userAgent.indexOf("Chrome"),
            safari: ~window.navigator.userAgent.indexOf("Safari"), // /^((?!chrome).)*safari/i.test(navigator.userAgent)?
        },
        todo = function () {
            // TODO: 
            console.error('a new island was found, please told the line()\'s author(roastwind)');        
        },
        line = (function(error, origin){
            // line, column, sourceURL
            if(error.stack){
                var line,
                    baseStr = '',
                    stacks = error.stack.split('\n');
                    stackLength = stacks.length,
                    isSupport = false;
                // mac版本chrome(55.0.2883.95 (64-bit))
                if(stackLength == 11 || brower.chrome){
                    line = stacks[3];
                    isSupport = true;
                // mac版本safari(10.0.1 (12602.2.14.0.7))
                }else if(brower.safari){
                    line = stacks[2];
                    isSupport = true;
                }else{
                    todo();
                }
                if(isSupport){
                    line = ~line.indexOf(origin) ? line.replace(origin, '') : line;
                    line = ~line.indexOf('/') ? line.substring(line.indexOf('/')+1, line.lastIndexOf(':')) : line;
                }
                return line;
            }else{
                todo();
            }
            return '😭';
        })(error, window.location.origin);
    return line;
}
window.log = function () {
    var _line = window.line.apply(arguments.callee.caller),
        args = Array.prototype.slice.call(arguments, 0).concat(['\t\t\t@'+_line]);
    window.console.log.apply(window.console, args);
}
log('hello');

এখানে এই প্রশ্ন সম্পর্কে আমার সমাধান ছিল। আপনি যখন পদ্ধতিটি কল করবেন: লগ, এটি লাইন নম্বরটি মুদ্রণ করবে যেখানে আপনি আপনার লগ মুদ্রণ করবেন


1

কিছুটা প্রকারভেদে ডিবাগ () একটি ফাংশন ফিরিয়ে আনা হয়, যা আপনার এটি যেখানে প্রয়োজন সেখানে সম্পাদন করা হয় - ডিবাগ (বার্তা) (); এবং তাই সঠিকভাবে কনসোল উইন্ডোতে সঠিক লাইন নম্বর এবং কলিং স্ক্রিপ্ট দেখায়, যখন একটি সতর্কতা হিসাবে পুনর্নির্দেশ করা বা ফাইলটিতে সংরক্ষণের মতো পরিবর্তনের জন্য অনুমতি দেয়।

var debugmode='console';
var debugloglevel=3;

function debug(msg, type, level) {

  if(level && level>=debugloglevel) {
    return(function() {});
  }

  switch(debugmode) {
    case 'alert':
      return(alert.bind(window, type+": "+msg));
    break;
    case 'console':
      return(console.log.bind(window.console, type+": "+msg));
    break;
    default:
      return (function() {});
  }

}

যেহেতু এটি কোনও ফাংশন ফিরিয়ে দেয়, সেই ফাংশনটি ();) দিয়ে ডিবাগ লাইনে সম্পাদন করা দরকার। দ্বিতীয়ত, বার্তাটি প্রাক-প্রক্রিয়াজাতকরণ বা আপনার প্রয়োজন হতে পারে যা পরীক্ষা করার অনুমতি প্রদানের পরিবর্তে ডিবাগ ফাংশনে প্রেরণ করা হয়, যেমন লগ-স্তরের রাজ্য পরীক্ষা করা, বার্তাটিকে আরও পাঠযোগ্য করে তোলা, বিভিন্ন ধরণের এড়িয়ে যাওয়া, বা কেবল আইটেমগুলি রিপোর্ট করা লগ স্তরের মানদণ্ড পূরণ;

debug(message, "serious", 1)();
debug(message, "minor", 4)();

1

আপনি এখানে যুক্তি সহজ করতে পারে। এটি ধরে নেয় আপনার গ্লোবাল ডিবাগ পতাকাটি গতিশীল নয় এবং অ্যাপ্লিকেশন লোডে সেট হয়েছে বা কোনও কনফিগার হিসাবে পাস করেছে passed এটি পরিবেশের পতাকাঙ্কণের জন্য ব্যবহার করার উদ্দেশ্যে তৈরি করা হয়েছে (উদাহরণস্বরূপ কেবল যখন মোডে প্রিন্ট হবে তবে উত্পাদন নয়)

ভ্যানিলা জেএস:

(function(window){ 
  var Logger = {},
      noop = function(){};

  ['log', 'debug', 'info', 'warn', 'error'].forEach(function(level){
    Logger[level] = window.isDebug ? window.console[level] : noop;
  });

  window.Logger = Logger;
})(this);

ES6:

((window) => {
  const Logger = {};
  const noop = function(){};

  ['log', 'debug', 'info', 'warn', 'error'].forEach((level) => {
    Logger[level] = window.isDebug ? window.console[level] : noop;
  });

  window.Logger = Logger;
})(this);

মডিউল:

const Logger = {};
const noop = function(){};

['log', 'debug', 'info', 'warn', 'error'].forEach((level) => {
  Logger[level] = window.isDebug ? window.console[level] : noop;
});

export default Logger;

কৌণিক 1.x:

angular
  .module('logger', [])
  .factory('Logger', ['$window',
    function Logger($window) {
      const noop = function(){};
      const logger = {};

      ['log', 'debug', 'info', 'warn', 'error'].forEach((level) => {
        logger[level] = $window.isDebug ? $window.console[level] : noop;
      });

      return logger;
    }
  ]);

আপনাকে এখন যা করতে হবে তা হ'ল লগারের সাথে সমস্ত কনসোল রেফগুলি প্রতিস্থাপন করা


1

এই বাস্তবায়নটি নির্বাচিত উত্তরের ভিত্তিতে এবং ত্রুটি কনসোলে শব্দের পরিমাণ হ্রাস করতে সহায়তা করে: https://stackoverflow.com/a/32928812/516126

var Logging = Logging || {};

const LOG_LEVEL_ERROR = 0,
    LOG_LEVEL_WARNING = 1,
    LOG_LEVEL_INFO = 2,
    LOG_LEVEL_DEBUG = 3;

Logging.setLogLevel = function (level) {
    const NOOP = function () { }
    Logging.logLevel = level;
    Logging.debug = (Logging.logLevel >= LOG_LEVEL_DEBUG) ? console.log.bind(window.console) : NOOP;
    Logging.info = (Logging.logLevel >= LOG_LEVEL_INFO) ? console.log.bind(window.console) : NOOP;
    Logging.warning = (Logging.logLevel >= LOG_LEVEL_WARNING) ? console.log.bind(window.console) : NOOP;
    Logging.error = (Logging.logLevel >= LOG_LEVEL_ERROR) ? console.log.bind(window.console) : NOOP;

}

Logging.setLogLevel(LOG_LEVEL_INFO);

0

আমি আমার সমস্যার প্রয়োজনের জন্য এই সমস্যার উত্তরগুলি পেয়েছি too কফিস্ক্রিপ্টে রেন্ডার করা এখানে একটি সহজ সমাধান। এটি ব্রায়ান গ্রিনস্টেডের সংস্করণ থেকে এখানে রূপান্তরিত

এটি বিশ্বব্যাপী কনসোল অবজেক্টটি ধরে নিয়েছে।

# exposes a global 'log' function that preserves line numbering and formatting.
(() ->
    methods = [
      'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
      'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
      'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
      'timeStamp', 'trace', 'warn']
    noop = () ->
    # stub undefined methods.
    for m in methods  when  !console[m]
        console[m] = noop

    if Function.prototype.bind?
        window.log = Function.prototype.bind.call(console.log, console);
    else
        window.log = () ->
            Function.prototype.apply.call(console.log, console, arguments)
)()

0

যেভাবে আমি এটি সমাধান করেছি তা হল একটি অবজেক্ট তৈরি করা, তারপরে অবজেক্ট.ডিফাইনপ্রোপার্টি () ব্যবহার করে অবজেক্টে একটি নতুন সম্পত্তি তৈরি করা এবং কনসোল সম্পত্তি ফিরিয়ে দেওয়া, যা তখন সাধারণ ফাংশন হিসাবে ব্যবহৃত হত তবে এখন বর্ধিত অযোগ্যতার সাথে।

var c = {};
var debugMode = true;

var createConsoleFunction = function(property) {
    Object.defineProperty(c, property, {
        get: function() {
            if(debugMode)
                return console[property];
            else
                return function() {};
        }
    });
};

তারপরে, আপনি ঠিক এমন কোনও সম্পত্তি নির্ধারণ করতে ...

createConsoleFunction("warn");
createConsoleFunction("log");
createConsoleFunction("trace");
createConsoleFunction("clear");
createConsoleFunction("error");
createConsoleFunction("info");

এবং এখন আপনি ঠিক যেমন আপনার ফাংশন ব্যবহার করতে পারেন

c.error("Error!");

0

অন্যান্য উত্তরের উপর ভিত্তি করে (মূলত @ সর্টেলিক্স এক) আমি নোড ইএস 6 এর জন্য এটি তৈরি করেছি, তবে একটি দ্রুত পরীক্ষা ব্রাউজারেও ভাল ফলাফল দেখিয়েছে। আমি কেবল রেফারেন্স হিসাবে অন্য ফাংশনটি পাস করছি।

let debug = () => {};
if (process.argv.includes('-v')) {
    debug = console.log;
    // debug = console; // For full object access
}

0

এখানে আমার লগার ফাংশন (উত্তরের কয়েকটি ভিত্তিতে)। আশা করি কেউ এটি ব্যবহার করতে পারবেন:

const DEBUG = true;

let log = function ( lvl, msg, fun ) {};

if ( DEBUG === true ) {
    log = function ( lvl, msg, fun ) {
        const d = new Date();
        const timestamp = '[' + d.getHours() + ':' + d.getMinutes() + ':' +
            d.getSeconds() + '.' + d.getMilliseconds() + ']';
        let stackEntry = new Error().stack.split( '\n' )[2];
        if ( stackEntry === 'undefined' || stackEntry === null ) {
            stackEntry = new Error().stack.split( '\n' )[1];
        }
        if ( typeof fun === 'undefined' || fun === null ) {
            fun = stackEntry.substring( stackEntry.indexOf( 'at' ) + 3,
                stackEntry.lastIndexOf( ' ' ) );
            if ( fun === 'undefined' || fun === null || fun.length <= 1 ) {
                fun = 'anonymous';
            }
        }
        const idx = stackEntry.lastIndexOf( '/' );
        let file;
        if ( idx !== -1 ) {
            file = stackEntry.substring( idx + 1, stackEntry.length - 1 );
        } else {
            file = stackEntry.substring( stackEntry.lastIndexOf( '\\' ) + 1,
                stackEntry.length - 1 );
        }
        if ( file === 'undefined' || file === null ) {
            file = '<>';
        }

        const m = timestamp + ' ' + file + '::' + fun + '(): ' + msg;

        switch ( lvl ) {
        case 'log': console.log( m ); break;
        case 'debug': console.log( m ); break;
        case 'info': console.info( m ); break;
        case 'warn': console.warn( m ); break;
        case 'err': console.error( m ); break;
        default: console.log( m ); break;
        }
    };
}

উদাহরণ:

log( 'warn', 'log message', 'my_function' );
log( 'info', 'log message' );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.