Logger

by egon

HTML

<div id="logDiv"></div>

CSS

* {
    font:normal 12px/16px Courier New, monospace;
    padding: 0;
    margin: 0;
};

JavaScript

logToDiv = (function(){
    var logDiv = document.getElementById("logDiv");
    return function(context, args){
        logDiv.innerHTML = 
            "<p>" + context + " : " + JSON.stringify(args) + "</p>" + 
            logDiv.innerHTML;
    };
})();

logToDiv("ctx1", ["alpha", 123, "test"]);
logToDiv("ctx2", ["alpha", 123, "test"]);
logToDiv("ctx3", ["alpha", 123, "test"]);

function NewLogger( def ) {
    var logger = {},
        tree   = {},
        sup  = {};

    var reservedKeys = /^(log|enabled|enabled?|disable|isEnabled|create|leave|enter|parent|fqn|_logger|\$|)$/;     
    sup.$ = tree;
    sup._logger = logger;
    sup.fqn = "";
    
    sup.log = function(args){
        logToDiv(this.fqn, args);
    };
    
    sup.enabled = true;
    sup.isEnabled = function(){
        var isRoot = this._logger.__proto__ === this,
            parentEnabled = (this === this.parent) 
                            || this.parent.isEnabled();
        return this.enabled && parentEnabled;
    };
    
    sup.enable = function(){ this.enabled = true; };
    sup.disable = function(){ this.enabled = false; };

    sup.create = function(name, enabled){
        var name = name;
        
        var f = function(){
            if( f.isEnabled() ){
                f.log( arguments );
            }
        };
        f.__proto__ = sup;
        
        f.fqn = this.fqn + "." + name;
        f.enabled = enabled;
        f.parent = this;
        
        f.enter = function(){
            this.log("-->");
            this._logger.__proto__ = f;
        };
        
        this[name] = f;
    };
    
    sup.leave = function(){
        this.log("<--");
        this._logger.__proto__ = this.parent;
    }
        
    var recurse = function( tree, def ){
        for(var n in def){
            if( reservedKeys.test(n) )
                continue;
            
            tree.create(n, true);
            if( def[n].log ){
                tree[n].log = def[n].log;
            };
         ...