Сейчас я разрабатываю приложение и устанавливаю глобальный 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.');
Затем я получаю этот результат в консоли Firefox.
info: Here is a msg. debug.js (line 8)
Что, если я хочу войти в систему с номером строки, откуда debug()
вызывается, например info: Here is a msg. main.js (line 2)
?
javascript
Руфус
источник
источник
console.log
для информации,console.warn
предупреждения иconsole.error
ошибки, вместо того, чтобы добавлять что-тоconsole.log
через функцию-оболочку.console
нужно ли его использовать. Кажется, что обертка - единственный способ достичь такой цели?Ответы:
Это старый вопрос, и все предоставленные ответы чрезмерно хакерские, имеют ОСНОВНЫЕ проблемы с кроссбраузерностью и не содержат ничего сверхполезного. Это решение работает во всех браузерах и сообщает все данные консоли в точности так, как должно. Никаких взломов не требуется и одна строка кода. Ознакомьтесь с кодом .
Создайте переключатель следующим образом:
Затем просто позвоните следующим образом:
Вы даже можете управлять console.log с помощью такого переключателя:
Если вы хотите сделать с этим что-то полезное ... Вы можете добавить все методы консоли и обернуть это функцией многократного использования, которая дает не только глобальный контроль, но и уровень класса:
Теперь вы можете добавить его в свои классы:
источник
console.log
дважды связать пользовательскуюlog()
функцию, содержащую два вызоваconsole.log
, однако номера строк будут отражать строку, котораяconsole.log
действительно находится, а не то, гдеdebug.log
вызывается. Однако вы можете делать такие вещи, как добавление динамических префиксов / суффиксов и т. Д. Есть также способы компенсировать проблему с номером строки, но я думаю, это другой вопрос. Посмотрите этот проект для примера: github.com/arctelix/iDebugConsole/blob/master/README.mdthis.isDebug
наfalse
, это не имеет значения. Я просто не знаю, есть ли какой-то способ обойти это, может быть, это сделано намеренно. В этом смысле,isDebug
это вводит в заблуждениеvar
иconst
вместо этого должно быть .Мне понравился ответ @fredrik , поэтому я свернул его с другим ответом, который разбивает стек Webkit , и объединил его с безопасной оболочкой console.log @ PaulIrish . «Стандартизирует»
filename:line
до «специального объекта», поэтому он выделяется и выглядит в основном одинаково в FF и Chrome.Тестирование в скрипке: http://jsfiddle.net/drzaus/pWe6W/
Это также работает в узле, и вы можете проверить это с помощью:
источник
console
методов, таких какwarn
,error
и т. д. - stackoverflow.com/a/14842659/1037948var line = stack.split('\n')[2];
-'undefined' is not an object
if(!stack) return '?'
к методу, который не работает, а не кВы можете поддерживать номера строк и выводить уровень журнала с помощью некоторого умного использования
Function.prototype.bind
:Сделав еще один шаг, вы можете использовать
console
различия между ошибками / предупреждениями / информацией и по-прежнему иметь настраиваемые уровни. Попытайся!источник
console.debug(...)
сfunction name
иarguments
- какие-либо мысли о том, как это сделать?%s
с%o
в Chrome будет печатать параметры так , как вы ожидали бы (объекты расширения, числа и строки окрашены, и т.д.).От: Как получить номер строки функции вызывающего абонента JavaScript? Как получить URL-адрес источника вызывающего абонента JavaScript?
Error
объект имеет свойство номер строки (в FF). Так должно работать примерно так:В браузере Webkit
err.stack
это строка, представляющая текущий стек вызовов. Он отобразит текущий номер строки и дополнительную информацию.ОБНОВИТЬ
Чтобы получить правильный номер полотна, вам нужно вызвать ошибку в этой строке. Что-то вроде:
источник
new Error();
дает мне контекст, в котором он выполняется, если я его вставлюdebug.js
, то получуinfo: Here is a msg. file: http://localhost/js/debug.js line:7
.Log = Error
? Вы все еще изменяете класс Error, верно?Здесь можно сохранить номер строки: https://gist.github.com/bgrins/5108712 . Это более или менее сводится к следующему:
Вы можете обернуть это с
isDebug
и установитьwindow.log
на ,function() { }
если вы не отладки.источник
Вы можете передать номер строки в свой метод отладки, например:
Здесь
(new Error).lineNumber
вы получите текущий номер строки в вашемjavascript
коде.источник
Chrome Devtools позволяет добиться этого с помощью Blackboxing . Вы можете создать оболочку console.log, которая может иметь побочные эффекты, вызывать другие функции и т.д., и при этом сохранять номер строки, которая вызывала функцию оболочки.
Просто поместите небольшую обертку console.log в отдельный файл, например
Назовите его как-нибудь вроде log-blackbox.js
Затем перейдите в настройки Chrome Devtools и найдите раздел «Blackboxing», добавьте шаблон для имени файла, которое вы хотите поместить в черный ящик, в данном случае log-blackbox.js
источник
Я нашел простое решение объединить принятый ответ (привязка к console.log / error / etc) с некоторой внешней логикой для фильтрации того, что на самом деле зарегистрировано.
Использование:
console.assert
используется условное ведение журнала.источник
Если вы просто хотите контролировать, используется ли отладка и иметь правильный номер строки, вы можете сделать это вместо этого:
Когда вам нужен доступ для отладки, вы можете сделать это:
Если
isDebug == true
, номера строк и имена файлов, показанные в консоли, будут правильными, потому чтоdebug.log
etc на самом деле является псевдонимомconsole.log
etc.Если
isDebug == false
сообщения отладки не отображаются, потому чтоdebug.log
etc просто ничего не делает (пустая функция).Как вы уже знаете, функция-оболочка испортит номера строк и имена файлов, поэтому рекомендуется избегать использования функций-оболочки.
источник
isDebug = true
иdebug.js
, но этот ответ действительно работает!window.debug = window.console
было бы немного чище.isDebug == false
. : {isDebug===true
. Или событие к этому: jsfiddle.net/fredrik/x6Jw5Решения трассировки стека отображают номер строки, но не позволяют щелкнуть, чтобы перейти к источнику, что является серьезной проблемой. Единственное решение сохранить такое поведение - привязать к исходной функции.
Связывание предотвращает включение промежуточной логики, потому что эта логика нарушит номера строк. Однако, переопределив связанные функции и играя с подстановкой консольной строки , некоторые дополнительные действия все же возможны.
Эта суть показывает минималистичную структуру ведения журнала, которая предлагает модули, уровни журнала, форматирование и правильные интерактивные номера строк в 34 строках. Используйте его как основу или вдохновение для своих нужд.
РЕДАКТИРОВАТЬ: суть включена ниже
источник
Идея со связыванием
Function.prototype.bind
великолепна. Вы также можете использовать библиотеку npm line -logger . Он показывает исходные исходные файлы:Создайте логгер кто угодно один раз в своем проекте:
Журналы печати:
источник
Вот способ сохранить существующие
console
операторы ведения журнала при добавлении имени файла и номера строки или другой информации трассировки стека в вывод:Тогда используйте это так:
Это работает в Firefox, Opera, Safari, Chrome и IE 10 (еще не протестировано в IE11 или Edge).
источник
my test log message (myscript.js:42) VM167 mypage.html:15
, которое не так удобно читать, к тому же оно не связано. По-прежнему хорошая работа, поэтому голос за нее.Это даст мне
info: "Here is a msg." main.js(line:2)
.Но
eval
нужно лишнее , жаль.источник
Код из http://www.briangrinstead.com/blog/console-log-helper-function :
источник
log
вызываетсяВ последнее время я сам занимался этой проблемой. Требовалось что-то очень простое, чтобы контролировать ведение журнала, а также сохранять номера строк. Мое решение не выглядит таким элегантным в коде, но обеспечивает то, что мне нужно. Если быть достаточно осторожным с закрытием и удержанием.
Я добавил небольшую обертку в начало приложения:
Чтобы позже я мог просто сделать:
Я тестировал его в firefox и crome, и оба браузера, похоже, отображают журнал консоли, как и предполагалось. Если вы заполняете таким образом, вы всегда можете расширить метод 'd' и передать ему другие параметры, чтобы он мог выполнять дополнительную регистрацию.
Пока не обнаружил серьезных недостатков для своего подхода, кроме уродливой строчки в коде для логирования.
источник
вот мое решение по этому вопросу. когда вы вызываете метод: log, он напечатает номер строки, в которой вы распечатываете свой журнал
источник
Небольшой вариант состоит в том, чтобы функция debug () возвращала функцию, которая затем выполнялась там, где она вам нужна - debug (message) (); и поэтому правильно показывает правильный номер строки и вызывающий сценарий в окне консоли, при этом допускаются такие варианты, как перенаправление в качестве предупреждения или сохранение в файл.
Поскольку он возвращает функцию, эту функцию необходимо выполнить в строке отладки с помощью () ;. Во-вторых, сообщение отправляется в функцию отладки, а не в возвращаемую функцию, что позволяет выполнять предварительную обработку или проверку, которая может вам понадобиться, например, проверка состояния на уровне журнала, повышение читабельности сообщения, пропуск различных типов или только элементы отчетов. соответствие критериям уровня журнала;
источник
Здесь можно упростить логику. Это предполагает, что ваш глобальный флаг отладки НЕ является динамическим и устанавливается при загрузке приложения или передается как некоторая конфигурация. Это предназначено для использования для маркировки среды (например, только печать в режиме разработки, а не производство)
Ванильный JS:
ES6:
Модуль:
Угловой 1.x:
Все, что вам нужно сделать сейчас, это заменить все ссылки консоли на Logger.
источник
Эта реализация основана на выбранном ответе и помогает уменьшить количество шума в консоли ошибок: https://stackoverflow.com/a/32928812/516126
источник
Я нашел некоторые ответы на эту проблему слишком сложными для моих нужд. Вот простое решение, созданное в Coffeescript. Это адаптировано из версии Брайана Гринстеда здесь
Он предполагает глобальный объект консоли.
источник
Я решил создать объект, а затем создать новое свойство объекта с помощью Object.defineProperty () и вернуть свойство консоли, которое затем использовалось как обычная функция, но теперь с расширенными возможностями.
Затем, чтобы определить свойство, вам просто нужно ...
И теперь вы можете использовать свою функцию так же, как
источник
На основе других ответов (в основном @arctelix one) я создал это для Node ES6, но быстрый тест также показал хорошие результаты в браузере. Я просто передаю другую функцию в качестве ссылки.
источник
Вот моя функция регистратора (на основе некоторых ответов). Надеюсь, кто-то сможет это использовать:
Примеры:
источник