Могу ли я расширить консольный объект (для изменения маршрута ведения журнала) в JavaScript? - PullRequest
29 голосов
/ 14 февраля 2012

Возможно ли расширить консольный объект?

Я пробовал что-то вроде:

Console.prototype.log = function(msg){
    Console.prototype.log.call(msg);
    alert(msg);
}

Но это не сработало. Я хочу добавить дополнительное ведение журнала к объекту консоли через структуру, подобную log4javascript , и все еще использовать стандартный объект консоли (в тех случаях, когда log4javascript недоступен) в моем коде.

Заранее спасибо!

Ответы [ 6 ]

39 голосов
/ 14 февраля 2012

Попробуйте следующее:

(function() {
    var exLog = console.log;
    console.log = function(msg) {
        exLog.apply(this, arguments);
        alert(msg);
    }
})()
11 голосов
/ 14 февраля 2012

Используйте шаблон прокси, см. Мой ответ для аналогичного случая:

JavaScript: переопределение оповещения ()

Надеюсь, это поможет

3 голосов
/ 12 декабря 2016

Вы также можете добавить время журнала таким образом:

добавлен момент или использовать Новая дата () вместо момента.

var oldConsole = console.log;
console.log = function(){
    var timestamp = "[" + moment().format("YYYY-MM-DD HH:mm:ss:SSS") + "] ";
    Array.prototype.unshift.call(arguments, timestamp);
    oldConsole.apply(this, arguments);
};
1 голос
/ 06 марта 2019

Для ECMAScript 2015 и более поздних версий

Вы можете использовать более новую функцию Proxy из ECMAScript 2015 стандарта, чтобы "захватить" глобальный console.log.

Исходный код

'use strict';

class Mocker {
  static mockConsoleLog() {
    Mocker.oldGlobalConsole = window.console;

    window.console = new Proxy(window.console, {
      get(target, property) {
        if (property === 'log') {
          return function(...parameters) {
            Mocker.consoleLogReturnValue = parameters.join(' ');
          }
        }

        return target[property];
      }
    });
  }

  static unmockConsoleLog() {
    window.console = Mocker.oldGlobalConsole;
  }
}

Mocker.mockConsoleLog();

console.log('hello'); // nothing happens here

Mocker.unmockConsoleLog();

if (Mocker.consoleLogReturnValue === 'hello') {
  console.log('Hello world!'); // Hello world!
  alert(Mocker.consoleLogReturnValue);
  // anything you want to do with the console log return value here...
}

Онлайн-демонстрация

Repl.it .

Пользователи Node.js...

... я вас не забываю.Вы можете взять этот исходный код и заменить window.console на gloabl.console, чтобы правильно ссылаться на объект консоли (и, конечно, избавиться от вызова alert).На самом деле я изначально написал этот код и протестировал его на Node.js.

1 голос
/ 06 апреля 2017
// console aliases and verbose logger - console doesnt prototype
var c = console;
c.l = c.log,
c.e = c.error,
c.v = c.verbose = function() {
    if (!myclass || !myclass.verbose) // verbose switch
        return;
    var args = Array.prototype.slice.call(arguments); // toArray
    args.unshift('Verbose:');
    c.l.apply(this, args); // log
};

// you can then do
var myclass = new myClass();
myclass.prototype.verbose = false;
// generally these calls would be inside your class
c.v('1 This will NOT log as verbose == false');
c.l('2 This will log');
myclass.verbose = true;
c.v('3 This will log');

Я заметил, что приведенное выше использование Array.prototype.unshift.call от nitesh является лучшим способом добавить тег 'Verbose:'.

0 голосов
/ 07 декабря 2018

Это на самом деле то же самое решение, которое дали некоторые другие, но я считаю, что это самый элегантный и наименее хакерский способ сделать это. Синтаксис распространения (... args) делает уверенным, что ни один аргумент не потерян .

var _console={...console}

console.log = function(...args) {
    var msg = {...args}[0];
    //YOUR_CODE
    _console.log(...args);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...