Стратегии для JavaScript console.log / trace и т. Д. - PullRequest
7 голосов
/ 19 июня 2010

Я пишу довольно большое программное обеспечение JavaScript. Мне нужно отслеживать вызовы, регистрировать события, отлаживать действия, поддерживать производительность и переносимость между браузерами.

Webkit и Firebug предлагают консольный объект с такими методами, как trace (), log (), error (), warning () и т. Д. Они великолепны, но что мне делать, если браузер IE или Opera?

Представьте, что у вас большое приложение, вы наверняка хотите увидеть все инициализации, которые оно выполняет, события, которые оно делает, и т. Д., Поэтому я делаю так, чтобы оно регистрировало их. Однако, если я просто зарегистрирую их, регистрация не будет работать в браузерах, в которых console не зарегистрировано в DOM. Я мог бы создать объект-оболочку:

MyNamespace.Console = {};
MyNamespace.Console.log = function(value) {
 if (console!==undefined) {
  console.log(value);
 }
 else {
  // What should I do to log events on other browsers?
 }
}

Из-за вышеизложенного в IE / Opera проблем не возникает, но как мне войти в IE (действительно нужно войти в IE!).

Кроме того, если я размещаю журналы везде в своем приложении, это замедляет меня, когда оно запускается в производственной среде? Должен ли я включить / выключить DEBUG и выполнить простую проверку перед регистрацией, что если DEBUG === true, то войти?

Как насчет таких систем, как Closure Compiler, можете ли вы сделать так, чтобы они убирали логи?

Что, если во время работы в производственной среде произошла ошибка, а запись в журнал не произошла, как отладить / найти проблему? И действительно, вы когда-нибудь отправляете журналы ошибок JavaScript вам (разработчику), чтобы убедиться, что у ваших клиентов нет проблем? Как это работает?

Я ценю любые отзывы / комментарии по отладке / ведению журнала с помощью JavaScript, я впервые пишу огромное приложение на JavaScript, и, честно говоря, я не уверен, что мне делать с этим ... отладка и ведение журнала в JavaScript, кажется, немного незаконченный.

Ответы [ 3 ]

4 голосов
/ 19 июня 2010

Я бы не рекомендовал возвращать данные журнала отчетов приложения разработчику - по крайней мере, не раскрывая их сначала пользователям / клиентам.

Безопаснее было бы регистрировать ошибки / события / отладкуДанные сначала поступают в массив, как предлагает Anurag, а затем периодически отправляют данные журнала на веб-сервер, где они могут храниться локально и периодически.Затем если у клиента возникают проблемы , они могут сами извлечь журналы для отладки и либо отправить их вам вручную, либо явно указать приложению передать журналы вам, разработчику.

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

3 голосов
/ 25 июня 2010

Сделайте поиск в Google для согласия redbird console.

Redbird позволяет вести удаленную регистрацию напрямую из любого совместимого со стандартами браузера, используя чистый JavaScript. Он не влияет на ваш веб-сервис и должен работать на Safari, Firefox, Chrome, Opera, MSIE, смартфонах и т. Д.

Redbird пригодится для отладки кода, который отлично работает в одном браузере, но делает что-то другое в другом. Общий способ регистрации и агрегирования сообщений в разных браузерах помогает выявить различия.

Использование флага DEBUG, как вы предложили, - хорошая идея. Множество сообщений отладки могут замедлить работу в производственной среде. Другим вариантом для производственной среды является замена функции ведения журнала пустой функцией, то есть функцией, которая ничего не делает. Это позволяет избежать большого количества операторов if DEBUG в коде.

3 голосов
/ 19 июня 2010

Вы можете просто добавить все сообщения журнала в массив или объект.Объект может выглядеть так:

var logMessages = {
    'log': [],
    'debug': [],
    'error': [],
    ...
};

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

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

if(!window.console) {
    var console = {};

    console.log = function(msg) {
        ..
    };

    console.debug = function(msg) {
        ..
    };

    ..
}

Список сообщений может быть синхронизирован с сервером, который, как я предполагаю, может быть необходим только для ошибок и, возможно, предупреждений.Чтобы перехватить все ошибки на странице, установите обратный вызов на window:

window.onerror = function() {
    ..
};

, а внутри обратного вызова отправьте отчет на сервер.Это может не очень хорошо играть с Opera.См. Обработка глобальных ошибок javascript

.
...