пятница, 4 января 2013 г.

Logging in GWT

1) Client logging
     Логирование в GWT эмулирует пакет java.util.logging, по этому он использует тот же синтаксис и имеет такое же поведение как на серверной стороне. Это позволяет обмениваться данными логирования между клиентом и сервером. Конфигурирование происходит через основной файл <gwt_app>.gwt.xml. В нем можно настраивать уровень протоколирования, включать/отключать различные обработчики, добавлять динамическое включение/отключения ведение логов и т.д. 
     GWT предоставляет множество обработчиков по умолчанию, которые будут вести записи через регистрацию. 
- SystemLogHandler - сообщения видны только в режиме разработки в окне development mode 
- DevelopmentModeLogHandler - логи вызываются через метод GWT.log(), сообщения выводятся только в devmode режиме в окне devmode. 
- ConsoleLogHandler - запись ведется в javascript консоль 
- FirebugLogHandler - логи выводятся в firebug консоль 
- PopupLogHandler - информация о логировании записывается в полупрозрачное окно, которое по умолчанию появляется в левом верхнем углу приложения. Окно можно изменять в размерах и минимизировать. 
 - SimpleRemoteLogHandler - обработчик отправляет сообщения на сервер, где они будут обработаны через механизм логирования на серверной стороне. 
     Для ведения логов на клиентской стороне достаточно указать, что мы хотим использовать логирование, включить подходящий обработчик в главный файл приложения и можно вызывать различные методы класса Logger
     GWT логирование хорошо документировано, поэтому за дополнительной информацией следует обращаться к первоисточнику. 
2) Dynamic client-side logging
     Рассмотрим реализацию динамического логирования, который позволяет легко управлять процессом в рантайме.
     Добавим поддержку логирования и установим уровень в файл модуля приложения <gwt_app>.gwt.xml.
 <!-- Add logging support -->
 <inherits name="com.google.gwt.logging.Logging" />
 <set-property name="gwt.logging.logLevel" value="INFO" />

* This source code was highlighted with Source Code Highlighter.
   Новое свойство модуля dynamicLogging сделает возможным включать и отключать логирование в зависимости от входного параметра logging. Если в url-е будет присутствовать параметр ?logging=some_value, то логирование будет включено несмотря на значение.
 <!-- Logging output depends on input query string parameter [logging] -->
 <define-property name="dynamicLogging" values="TRUE, FALSE" />
 <property-provider name="dynamicLogging">
     <![CDATA[
         if (window.location.href.indexOf("logging") != -1) {
             return "TRUE";
         }

         return "FALSE";
     ]]>
 </property-provider>


* This source code was highlighted with Source Code Highlighter.
     Также можно написать переключатель таким образом, чтобы логирование зависело от значения параметра logging. Если true - включено, во всех остальных случаях вывод будет отключен.
 <!-- Logging output depends on input query string parameter [logging] -->
 <define-property name="dynamicLogging" values="TRUE, FALSE" />
 <property-provider name="dynamicLogging">
     <![CDATA[
         function equals(name) {
            name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regexS = "[\\?&]" + name + "=([^&#]*)";
            var regex = new RegExp(regexS);
            var results = regex.exec(window.location.href);
            if (results == null)
                return "";
            else
                return results[1];
        }

         if (window.location.href.indexOf("logging") != -1) {
             if (equals("logging").toLowerCase() == "true") {
                 return "TRUE";
             }
         }

         return "FALSE";
     ]]>
 </property-provider>


* This source code was highlighted with Source Code Highlighter.
     Переопределенное свойство gwt.logging.enabled зависит от значения dynamicLogging.
 <set-property name="gwt.logging.enabled" value="FALSE">
     <!-- disable logging -->
     <when-property-is name="dynamicLogging" value="FALSE" />
 </set-property>


* This source code was highlighted with Source Code Highlighter.
     Теперь логированием можно управлять простым добавлением параметра в url http://127.0.0.1:8888/GwtLoggingApp.html?gwt.codesvr=127.0.0.1:9997?logging=true или ?logging=false.
...
private static final Logger logger = Logger.getLogger(GwtLoggingApp.class.getName());
logger.log(Level.INFO, e.getMessage());
...


* This source code was highlighted with Source Code Highlighter.
3) Remote logging
     Включения логирования на сервере осуществляется также просто. Добавим модуль logging в проект и обработчик, отвечающий за ведение логов на сервере.
 <inherits name="com.google.gwt.logging.Logging" />
 <set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED"/>


* This source code was highlighted with Source Code Highlighter.
В файле web.xml необходимо определить удаленный сервлет логирования.
 <servlet>
    <servlet-name>remoteLoggingServlet</servlet-name>
    <servlet-class>com.google.gwt.logging.server.RemoteLoggingServiceImpl</servlet-class>
 </servlet>

 <servlet-mapping>
    <servlet-name>remoteLoggingServlet</servlet-name>
    <url-pattern>/gwtloggingapp/remote_logging</url-pattern>
 </servlet-mapping>


* This source code was highlighted with Source Code Highlighter.
4) Stack traces logging exception 
     Знания о выброшенном исключении обычно не очень полезно, если вы не знаете точно, где оно произошло. При компилировании Java кода в Javascript, он уменьшается и обфусцируется. Безусловно, это очень полезно для производительности и безопасности, но с точки зрения поддержки приложения, определенные вещи тяжелее реализовать. Если взглянуть на обфусцированный код, то вместо привычных имен классов и методов можно увидеть приблизительно следующее: Unknown.Qs(Unknown source), что не очень полезно. 
    К счастью, существуют разные варианты того, как GWT компилируется в Javascript, который предоставляет различные объемы информации для отладки. Но придется заплатить безопасностью и производительностью. Для красивого и чистого Javascript кода, который будет напоминать Java код, и предоставлять понятный stack trace, можно установить флаг -style в PRETTY(код станет читабельным) или DETAILED(еще более читабельный код + подробные имена переменных). По умолчанию флаг style установлен в режим OBF(обфускация). Это сделано для защиты интеллектуальной собственности разработанного приложения, для уменьшения размеров Javascript файлов, что делает их быстрее для загрузки и обработки. 
     Но есть компромисс позволяющий сохранять имена файлов и номера строк в stack trace и одновременно обфусцировать весь код приложения. При этом величина Javascript кода будет увеличена. Необходимо добавить следующие строки в файл *.gwt.xml:
 <set-property name="compiler.stackMode" value="emulated" />
 <set-configuration-property name="compiler.emulatedStack.recordLineNumbers" value="true"/> 
 <set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true"/>


* This source code was highlighted with Source Code Highlighter.

Комментариев нет:

Отправить комментарий