views:

56

answers:

1

I will be releasing my Air/Flex application soon, but I am pretty sure there are a couple of bugs that may pop up on the various platforms that Air is available for. So I was wondering if there is a way to implement a mechanism, that would send an error report, logging where the error happened, to a remote server each time an app crashes? This way I might catch errors that otherwise would go unnoticed.

+1  A: 

Global error handling is now supported in Flash 10 and AIR2. More info on that here: http://help.adobe.com/en_US/air/reference/html/flash/events/UncaughtErrorEvent.html

Using that kind of functionality to catch uncaught exceptions; you can submit the trace to some web service set up specifically to grab them. Using Google App Engine is excellent for this purpose since it already has a logging feature which grabs all kinds of meta data from the client calling the application. Also, if your logs become huge for some reason - at least you wont have to worry about storing them. Google does that for you :)

I've set up such a service as outlined below (granted it has some flaws, in particular anyone can call it and add "traces", but you could add some shared secret and post over HTTPS to have some tiny measure of security).

App Engine Logging Service

#!/usr/bin/env python

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

class MainHandler(webapp.RequestHandler):

    def post(self):
        import logging

        if self.request.get('trace'):
            logging.error(self.request.get('trace')) #Adds a row to GAE:s own logs :)
            self.response.out.write('trace logged')
        else:
            set_status(501)

    def get(self):
    """ Kill this function when done testing """
        test_form = """
            <form action="/" method="POST">
                <textarea name="trace"></textarea>
                <input type="submit">
            </form>"""

        self.response.out.write(test_form)

def main():
    application = webapp.WSGIApplication([('/', MainHandler)],
                                   debug=False)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

I wrote a little AIR-app containing this little test function which simply POST:ed the app engine service with the parameter "trace" specified.

Posting to the logging service (ActionScript)

private function postToLogger(event:MouseEvent):void
{
    var service:HTTPService = new HTTPService();

    var parameters:Object = {'trace': "omg something went wrong"};
    service.url = "https://YOURSUPERSIMPLELOGGINGSERVICE.APPSPOT.COM";
    service.method = HTTPRequestMessage.POST_METHOD;
    service.resultFormat = HTTPService.RESULT_FORMAT_E4X;
    service.addEventListener("result", onSuccess);
    service.addEventListener("fault", onError);
    service.send(parameters);
}

And finally, this is how it looks in the logs, lots of metadata, and of the trace you caught in your AIR app.

Google App Engine Logging feature

pellepim
Sweet! Google App Engine rules!
PEZ