LINUX.ORG.RU

JS console.log прокачка


0

1

Всем привет.

Не могу догнать как реализовать следующее.

Нужно либо сам console.log либо сделать копию функции, которая будет выводить лог по триггеру, допустим если log = true, то при console.log('test log') лог посыпится, если log = false, то ничего.

Я пробывал делать так

function log(s){
if(log)
  console.log(s)
}

Но так строка лога будет одна и та же, а надо чтобы указывалась та строка в которой вызывается функция log. как быть? Как узнать номер строки хотя бы



Последнее исправление: spiritkhl (всего исправлений: 1)

Как-то так?

var trigger = true
var  _exlog = console.log
console.log = function(param) {
    if( trigger )
        _exlog(param)
}

console.log("test1")
trigger = false
console.log("test2")

Последнюю строку в твоём посте не понял.

Reaper ★★
()

Выложил в svn свою js-библиотечку с полезными функциями, которую дополняю потихоньку, там можешь посмотреть пример такой консольки. Лицензия свободная.

Boba_Fett
()
Ответ на: комментарий от Reaper

Так я тоже пробовал. Но не вышло из-за ошибки типа «Illegal invocation», т.е. видать это сделано в плане безопасности.

Такая ошибка в хроме, сафари и в опере.

В последней строке я действительно чушь какую то написал. Перефразирую:

В моей приведенной функции все работает, но есть один недостаток, при выводе в консоль указыается еще строка откуда консолится, вот это строка в моей функции всегда одна, где бы я функцию не вызвал всегда указывается строка моей функции. Но это и правильно, так и должно быть, поэтому и ищу другой путь

spiritkhl
() автор топика
Ответ на: комментарий от Boba_Fett

почитав код я понял что у вас для хрома вообще строка консоли не указывается, т.к. работает через eval

spiritkhl
() автор топика
Ответ на: комментарий от spiritkhl

почитав код я понял что у вас для хрома вообще строка консоли не указывается, т.к. работает через eval

У вебкитовых браузеров (и IE) проблемы с передачей аргументов, приходится делать через хак. В Опере и ff все нормально.

Boba_Fett
()
Ответ на: комментарий от helios

Я вот что то не нагуглил, в php допустим есть такая штука как __LINE__ она указывает текущую строку.

Я не нашел в js подобного, но чувствую что оно есть, ведь как то console.log её выводит!

spiritkhl
() автор топика

Например:

;(function (window, doc) {
    var getLogger,
        emptyLog = function () {},
        logger = {
            log: emptyLog,
            enable: function () {
                if (console) {
                    logger.log = console.log.bind(console);
                }
            },
            disable: function () {
                logger.log = emptyLog;
            }
        };

    getLogger = function () {
        return logger;
    };

    logger.enable();

    window.logger = getLogger();

}) (this, this.document);

RR
()
Ответ на: комментарий от spiritkhl

console.log дергает стэк-трейс и показывает верхний вызов, поэтому и строка всегда из враппера, тут либо забить на ие < 9 и использовать Function.prototype.bind (ниже мой пример), либо самому дергать трейс и доставать строку вызова из 2го елемента.

RR
()
Ответ на: комментарий от Boba_Fett

кстати, довольно интересно, можно ли снять с стэк-трейса значения перед вызовом консоль.лог, я что-то не нагуглил.

RR
()
Ответ на: комментарий от helios

А я-то думаю, что за нода ))

Да, делали синхронизатор ajax-запросов (было порядка десятка параллельных с разным периодом ожидания), GDC там пригодился. Да и всплывает иногда, не часто, но зачем писать с нуля?

Boba_Fett
()
Ответ на: комментарий от RR

В квирксах да, в нормальнои режиме все ок

Только что проверил в IE9:

SCRIPT438: Object doesn't support property or method 'bind'

html:

<!DOCTYPE html>
<html lang="ru">
<head>
	<meta charset="utf-8">
</head>
<body>
<!-- scripts -->
<script>
(function (window, doc) {
    var getLogger,
        emptyLog = function () {},
        logger = {
            log: emptyLog,
            enable: function () {
                if (console) {
                    logger.log = console.log.bind(console);
                }
            },
            disable: function () {
                logger.log = emptyLog;
            }
        };

    getLogger = function () {
        return logger;
    };

    logger.enable();

    window.logger = getLogger();

})(this, this.document);

window.logger.log('test');
</script>
</body>
</html>

Boba_Fett
()
Ответ на: комментарий от RR
-logger.log = console.log.bind(console);
+logger.log = Function.prototype.bind.call(console.log, console);
RR
()
Ответ на: комментарий от RR

Оказалось, что M$ сделали лог не функцией, а объектом, потому и bind не работает. Посмотри typeof console.log в IE9.

Дабы сделать console.log обратно функцией, как и должно быть, можно немного подхачить:

console.log = Function.bind.call(console.log, console);

Сделать нужно перед bind'ом, тогда все работает.

Boba_Fett
()
Ответ на: комментарий от spiritkhl

Так я тоже пробовал. Но не вышло из-за ошибки типа «Illegal invocation», т.е. видать это сделано в плане безопасности.

Хром, IE9 и Опера12 (в 11.60 было все нормально) выдают ошибку на такой код:

function log(){
	console.log.apply(this, arguments);
}
log('test', 123)
Uncaught TypeError: Illegal invocation 

Но, если переопределить console.log, то все ок:

function log(){
	console.log = Function.bind.call(console.log, console);
	console.log.apply(this, arguments);
}
log('test', 123)
test 123 

Boba_Fett
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.