[Mapbender-dev] State of Logging, Exceptions

Karim Malhas karim at malhas.de
Mon Feb 8 12:54:03 EST 2010


Dear All,

I recently looked into what Mapbender offers as it's logging options,
and I found this :
 //if you are familiar with the logging code, skip down to "While this works";

Clientside:

 classes in lib/exception.js:
  Mapbender.Exception, Mapbender.Warning, Mapbender.Notice
  all derived from the class Mb_log

  usage:
    new Mapbender.Exception("exeption message goes here");

  The different classes differ internally in that they call
  Mb_log.throwException(message,level) with different levels
  this function in return checks if the loglevel is defined somewhere
  globally, and then depending on the value of another global variable,
  either posts the stuff to the server, issues a console.log, or simply
  alerts.

  If the logmessage reaches the serverside, they are translated into
  an approximate serverside log-equivalent (php/mb_js_exception.php)

  
Serverside
  
  classes:
    mb_exception, mb_warning, mb_notice 
    all derived from mb_log (which is an abstract class)

  usage:
    $e = new mb_exception("exception message goes here");
    $e = new mb_warning("warning message goes here");

  The same way as the javascript logging classes, the difference between
  these different classes, ist just that they internally set a different
  string and pass it to the mb_log method they inherted from mb_log (the
  class)
  The messages end up in the "log/" directory of the Mapbender
  installation.





While this works, to me this is not an ideal situation.

- The code mixes the concepts of Logging and Exceptions:
  When I think of Exceptions, I think of objects that can be thrown and
  caught, and when neccesary, logged to the DEBUG (or some other) level.
  But not every Exceptions needs to generate a log entry, rather, it
  should be dealt with, bubbled up, and only if all else fails should
  the user (via some kind of notification) or the developer (via the
  log) be informed of a problem.

- All logs go to a file, or configurable from core/system.php to FireBug
  There's no flexible way to change the location of the logfile (one has
  to change php/classes_mb_log.php).
  There's also no way to log to syslog, for example


So I propose we change it :-) maybe not right now, but we could keep it
in mind.

I am thinking something along the lines of the following: 

Clientside:

  var log = new Logger("mapbender_installation_5);

  var alertHandler = new AlertHandler();
  log.addHandler(alertHandler);

  var serverHandler = new ServerHandler("log.php");
  log.addHandler(serverHandler);


  log.notice("mapbender is starting up");
  ...
  log.debug("loaded 24 elements");
  try{
    ...
  }catch(E){
    if (E instanceOf TypeError){
      // tell user to enter better data
      return;
    }

    // all else failed
    log.debug("caught Exception in the_method(): "+ E);
    // tell user that evreything went horribly wrong and they should
    // try turning it off and on again
  }

(and something similar for serverside php)


So there are two components to generating the log message:

- a Logger class that takes care about which loglevels to provide, and
  which loglevels to log

- a logHandler class that actually formats and writes a logmessage.
  On the client side, the message could go into an alert, the console,
  written onto the page itself, displayed in a jquery dialog, set to the
  server, etc
  On the Server side the message could go into the normal mapbender log,
  to syslog, Firebug, the Windows eventlog, and wherever else you could want it.

  I am especially after being able taking advantage of syslog.


I actually have a (mostly complete) implementation of the above, and I
was wondering if anyone else is interested in having this integrated.

Maybe it's not the right time, with a release coming up, but it has
bothered me a bit for a while.


Regards,
Karim



More information about the Mapbender_dev mailing list