GWTのloggingを使ってみる

Developer's Guide - Logging - Google Web Toolkit - Google Code
GWT 2.1からクライアント側でjava.util.loggingパッケージのクラスが使えるようになってます。といっても私はあまり使ったことがないんですが。。クライアントでもこんな感じでログ出力が可能です。

Logger logger = Logger.getLogger(Foo.class.getName());
// ...
logger.info("test log.");

ログの出力先としてはポップアップでログを表示するhandlerや、サーバ側にログを送信するhandlerなどが標準で利用できます。GWT添付のサンプルコードに詳しいサンプルがあります。

これまでも、Googleのフレッド・ソオーさんのgwt-logというライブラリがありましたが、2.1からは標準でだいたい同じようなことができるようになったようです。

inheritsの追加

loggingを使用するためには、モジュールXMLファイル(*.gwt.xlm)に以下の行を追加します。

<inherits name="com.google.gwt.logging.Logging" />

ハンドラの設定

上記でinheritsしたLogging.gwt.xmlでは、以下の7種類のハンドラが登録されていて、SimpleRemoteHandlerのみDISABLEDに設定されています。

  • SystemLogHandler: stdoutに出力する(WARNING以下はSystem.out、それ以上はSystem.err)。
  • DevelopmentModeLogHandler: GWT.log()に出力。
  • ConsoleLogHandler: javascriptのconsole(console.log())に出力する。
  • FirebugLogHandler : Firebugに出力する。
  • HasWidgetsHandler : ウィジェットに追加する。
  • PopupLogHandler: 画面上にポップアップウィンドウを開いて出力する。
  • SimpleRemoteLogHandler: サーバ側に出力する。

また、ログレベルはINFOでSimpleRemoteLogHandlerのみ無効になってるみたいです。

  <set-property name="gwt.logging.enabled" value="TRUE"/> 
  <set-property name="gwt.logging.logLevel" value="INFO"/>
  <set-property name="gwt.logging.consoleHandler" value="ENABLED" />
  <set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />
  <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
  <set-property name="gwt.logging.hasWidgetsHandler" value="ENABLED" />
  <set-property name="gwt.logging.popupHandler" value="ENABLED" />
  <set-property name="gwt.logging.systemHandler" value="ENABLED" />
  <set-property name="gwt.logging.simpleRemoteHandler" value="DISABLED" />

この設定をモジュールのXMLに記述することで、ログレベルや使用するハンドラを変更することができます。

ログレベルについては、URLのパラメータに"logLevel=SEVERE"のように指定することもできるようです。SEVEREとかFINEという指定はなれないと分かりづらいですね。enabledについてもURLで指定できるのかと思い試してみたのですが、うまくいきませんでした。この辺はDeferred bindingよく理解していないので、、どうやってプロパティを渡せるのかまだよくわかりません。

リモートロギング

リモートロギングではクライアント側でログが出力されると、ハンドラによってサーバ側のサーブレットに内容が送信されます。なので、リモートロギングを有効にするにはログを受け取るサーブレットをweb-xmlに追加する必要があります(contactsの部分はコンテキストパスです)。

  <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>/contacts/remote_logging</url-pattern>
  </servlet-mapping>

次にモジュールのXMLファイルに以下の設定を追加します。

<set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />

これでサーバ側でログ出力されます。ただ、私が試したところサーバ側で出力されるログでは以下のようにロガーがクライアント側で指定したものではなく、RemoteLoggingServiceUtilになりました。

2010/12/14 23:22:20 com.google.gwt.logging.server.RemoteLoggingServiceUtil logOnServer
情報: test log.

ログは逐次送信されるので、本番環境で使う場合は設定や運用に注意が必要そうですが、、Ajaxのアプリケーションは動作のログを取りにくいのでサービスのデバッグや操作履歴の収集にも使えるんじゃないかと思います。