2009年12月8日火曜日

XMPPを使ったログの通知

AppEngineで開発している時に開発環境ではなく、実環境上でデバッグしたい事がよくあります。しかし、実環境上では当然ログのtailなど出来るわけはなく、ログを見るためにログページへ行って毎回リロードなんてことをしなければならず、これが非常に苦痛です。そこで巷では見捨てられた感もあるXMPPServiceを使ってログを通知出来る仕組みを作ってみました。利用したロギングライブラリは、sl4jとlogback-classicです。

まず、以下のようなXMPPServiceにログを出力する為のAppenderを作成します。

public class XmppAppender extends AppenderBase<ILoggingEvent> {

    private XMPPService service = XMPPServiceFactory.getXMPPService();

    private String notifyTo;

    public String getNotifyTo() {
        return notifyTo;
    }

    public void setNotifyTo(String notifyTo) {
        if (notifyTo == null || notifyTo.isEmpty()) {
            throw new IllegalArgumentException();
        }
        this.notifyTo = notifyTo;
    }

    @Override
    protected void append(ILoggingEvent eventObject) {
        JID jid = new JID(notifyTo);
        Message message = new MessageBuilder()
            .withMessageType(MessageType.CHAT)
            .withRecipientJids(jid)
            .withBody(getLayout().doLayout(eventObject))
            .build();
        switch (service.sendMessage(message).getStatusMap().get(jid)) {
        case SUCCESS:
            return;
        case INVALID_ID:
            throw new LogbackException("failed to append log event for invalid id:" + jid);
        case OTHER_ERROR:
            throw new LogbackException("failed to append log event for unknown error:" + jid);
        default:
            throw new AssertionError();
        }
    }

}

次に、logback.xmlにappenderの設定を書きます。ここで先程作成したXmppAppenderを設定し、notifyToに通知先にするGoogleAccountを設定します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 <appender name="XMPP" class="com.gluegent.tools.appengine.logging.XmppAppender">
   <notifyTo>someoneあっとgmail.com</notifyTo>
   <layout class="ch.qos.logback.classic.PatternLayout">
     <pattern>%-5p %d [%t] %m%n</pattern>
   </layout>
 </appender>
 <root>
   <level value="TRACE" />
   <appender-ref ref="XMPP" />
 </root>
</configuration>

ここまでで、プロジェクトに対する設定は終わりです。

最後に、プロジェクトのデプロイ先からの通知を受けられるようにする為に、GTalkクライアントであっとappspot.comを追加します。以上ですべての設定が終わり、プロジェクトをデプロイすればログがGTalkクライアントに通知されてきます。

これで今までのように毎回画面更新をする必要もなくなり、Eclipseでコンソールを見ながら開発しているような感覚で本番環境上でのデバッグが行えるようになります。ただ一点悲しいのが、XMPPServiceの利用はdefault versionになっていないと出来ない為、同一AppId上では複数の開発者が自分の為だけに利用する事が出来ません。Cron、TaskQueueなどについても言えることなので、そのうちversion別の対応がされて欲しいですね。それでは皆様快適?なログライフを~!

0 件のコメント:

コメントを投稿