2012-06-25 1 views
5

Библиотека google-closure также содержит logging system, который должен быть знаком большинству разработчиков. Это мило. К сожалению, вывод, который вы получаете, менее выразителен, как при использовании console.log, как это было сделано некоторыми браузерами/плагинами.Возможно ли получить лучший результат для `goog.debug.Logger` (например,` console.log`)?

Например, если вы написали console.log(window) в Chrome, консоль отобразит объект, который вы можете интерактивно проверить. При использовании регистратора google-закрытия он этого не сделает. Я предполагаю, что он будет внутренне просто передавать строковое представление вашего объекта на console.log. Таким образом, вы теряете много удобства.

Из-за этого я все еще продолжаю использовать console.log. Но тогда, если вам удастся удалить его из производственного кода, ваш код будет разбит в браузерах, которые не имеют console.log (f.ex .: IE).

В качестве альтернативы, можно защититься от этого, путем проверки наличия первого, например:

window.console && window.console.log && console.log(...) 

или:

if (DEBUG) { 
    console.log(...) 
} 

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

Так что мой вопрос (tl/dr): Могу ли я сделать пользователя закрытия Google console.log(x), когда я пишу myLogger.info(x) вместо него, используя строковое представление x?

ответ

5

Вы также можете использовать goog.debug.FancyWindow, чтобы иметь отдельное окно для показа журнала. Дополнительную информацию см. На демо-странице Google закрытия: https://github.com/google/closure-library/blob/master/closure/goog/demos/debug.html и посмотрите исходный код.

Еще одно преимущество, если вы используете только вырубку консоли является то, что структура будет автоматически предварять имя модуля и время ... Просто добавьте на следующие строки, чтобы использовать протоколирование консоли:

goog.require('goog.debug.Console'); 

if (goog.DEBUG) { 
    debugConsole = new goog.debug.Console; 
    debugConsole.setCapturing(true); 
} 

Это также предотвратит показ консоли в производственном коде.

С уважением,

Рене

+0

Критическое бит я искал был 'goog.debug.expose'. Я пропустил это, когда впервые посмотрел на документы фреймворка! Хотя это не так удобно, как интерактивный «console.log» дамп, в большинстве случаев это будет хорошо. Так что спасибо! – exhuma

+0

Я боюсь, что код в этом ответе вызовет ошибки. Поскольку вы используете 'goog.debug.Console' сразу после его импорта' goog.require ... ' – hguser

2

Google Closure может предоставить информацию в соответствии с вашими потребностями. С функцией без функций объекта. См. Ниже фрагмент кода.

goog.require('goog.debug'); 
goog.require('goog.debug.Logger'); 

var theLogger = goog.debug.Logger.getLogger('demo'); 
theLogger.info('Logging examples'); 

// Create a simple object. 
var someone = { 
    'name': 'peder', 
     'age': 33, 
     'gender': 'm', 
     'kids': ['hari', 'sam', 'sneha'] 
}; 

// Show the object, note that it will output '[object Object]'. 
theLogger.info(someone); 

// Use expose to walk through the object and show all data. 
theLogger.info('Person: ' + goog.debug.expose(someone)); 


// Does not show the functions by default. 
theLogger.info('expose (no functions): ' + goog.debug.expose(yourObject)); 


// Shows the functions as well. 
theLogger.info('expose (w/functions): ' + goog.debug.expose(yourObject, true)); 

// Show deepExpose, which walks recursively through data. 
theLogger.info('deepExpose (no functions): ' + goog.debug.deepExpose(yourObject)); 

theLogger.info('deepExpose (w/functions): ' + goog.debug.deepExpose(yourObject, true)); 
+0

' goog.debug.expose' является полезным. Все еще не так полезно, как вывод, который вы получаете из 'console.log'. – exhuma