2015-02-09 4 views
1

Иногда я вижу приказ о запуске журнала при загрузке приложения и не помню, как вызывался оператор журнала. Есть ли способ найти трассировку стека сообщения журнала консоли из инструментов разработчика Chrome?Получение трассировки стека консольного сообщения

Прямо сейчас, я обернуть console.log с функцией, которая печатает трассировку стека:

console.log = (function() { 
    var oldLog = console.log.bind(console); 

    return function() { 
    try { throw new Error(); } catch (e) { 
     oldLog(
     e.stack.split('\n') 
      .slice(2) 
      .map((line) => line.trim().replace('at', 'from')) 
      .join('\n') 
    ); 
    } 

    oldLog.apply(null, Array.prototype.slice.call(arguments)); 
    }; 
}()); 

Это напечатает трассировку стека в дополнение к сообщению журнала. Чтобы это было полезно, я должен вставить этот код непосредственно перед тем, как какой-либо из моих кодов запускается. Есть ли способ узнать эту информацию только с консоли, не добавляя этот обертку?

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

+0

Когда вы выполняете console.log из кода (а не из консоли), вы можете просмотреть все пути в правой части консоли, чтобы увидеть местоположение (и даже щелкнуть его, чтобы открыть его.) Это, конечно, t, если вы переопределите его своей собственной функцией, потому что тогда он просто укажет на вашу замену console.log вместо той, которая используется непосредственно в коде. –

+0

ах, справа. как насчет трассировки стека? – Robz

+1

Те, которые существуют только для ошибок, поэтому вы не сможете получить это с помощью console.log. Вы пробовали console.trace? –

ответ

1

Вы попробовали console.trace()? Он доступен в Chrome и Firefox. Для вашего прецедента вы можете отслеживать журнал псевдонимов.

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

EDIT:

Там в настоящее время не любой хром: // флаги, которые позволили бы установить, что поведение, но вы могли бы сделать это прежде, чем консоль вызывается, (например, в верхней части ваших уменьшенная JS) : console.log=console.trace;

Который будет иметь этот эффект, (пример в консоли Chrome канарейки):

> console.log("Hello, Robz"); 
VM929:2 Hello, Robz 
undefined 
> console.log = console.trace; 
function trace() { [native code] } 
> console.log("Hello, Robz"); 
    VM935:2 Hello, Robz 
    VM935:2 (anonymous function) 
    VM468:777 InjectedScript._evaluateOn 
    VM468:710 InjectedScript._evaluateAndWrap 
    VM468:626 InjectedScript.evaluate 
+0

О, это круто. console.trace эффективно делает то же самое, что и обертка, которую я написал. по слову «alias» вы имеете в виду делать то, что я делаю с моей оберткой? Я хотел бы сделать это без необходимости изменять свой код вообще - могу ли я использовать его как настройку браузера? – Robz

+0

Вы обертка изящна, но встроенная функция быстрее. Я уточню свой ответ со спецификой. – msanford

+0

Вы можете так же легко обернуть это в 'if()' поиске своей среды развертывания: if production, 'console.log = function() {};', если вы хотите сделать небольшой слабый шаг для смягчения вашего журнала утечки. Это, в свою очередь, все еще можно переопределить, поэтому лучше всего использовать препроцессор (grunt?), Чтобы искать 'console' и strip. – msanford

0

в принципе. Чтобы показать источник сообщения о регистрации, это была очень плохая идея. Это приводит к тому, что вы записываете сообщения журнала, которые не принадлежат коду, и не могут быть локализованы без трассировки стека.

Как вы работаете в команде?

hey, i got a `ohoh!`-logging in file abc.js in line 3487! 

Чтобы понять эту проблему путем проверки вызова стек означает: Эй, я не нужен текстовое сообщение, я не нужно сообщение, что именно происходит, только где.

+1

Действительно.Я на самом деле пытаюсь отлаживать логические заявления, добавленные членом команды, не помещая контекст в сообщение :) – Robz

Смежные вопросы