• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Logger für Javascript-Objekte bauen

Gilles

Blogger
Hallo Leute,
Ich bin derzeit dabei einen Logger für javascript zu schreiben. Das Problem ist, das ich gerne auch den Namen der Funktion ausgeben lassen möchte, die das Logging aufruft.

Hier mal eine kleine Version mit einem Beispiel (Keine Angst mein Logger sieht nicht so aus :D):

Code:
function Logger() {
  this.debug = function(msg) {
    I.write(msg,"debug");
  };

  this.warn = function(msg) {
    I.write(msg, "warn");
  };
  
  this.write = function(msg, level) {
    try {
      switch(level) {
        case "debug" : function() { console.debug(msg);} break;
        case "warn" : function() { console.warn(msg);} break;
      }
    } catch(e) {}
  };
  
  var I = this;
}


function Klasse() {
  var log = new Logger();
  
  this.sayHiInLog = function() {
    log.debug("Ich bin eine Debug Nachricht"); 
  };
}

Die ganze Log-Level Geschichte habe ich jetzt mal weggelassen.
Meine Frage wäre: Komm ich ich irgend wie an den Wert "sayHiInLog" innerhalb der Funktion Logger::write oder Logger::debug?
Ich hab es vorhin mal mit arguments.calle.caller(.caller ...) probiert, aber irgend wie bin ich da nicht dran gekommen.
 
Meine Frage wäre: Komm ich ich irgend wie an den Wert "sayHiInLog" innerhalb der Funktion Logger::write oder Logger::debug?
Ich hab es vorhin mal mit arguments.calle.caller(.caller ...) probiert, aber irgend wie bin ich da nicht dran gekommen.
So kommst du nur an die Funktionsreferenz ran, aber nicht an die Eigenschaft der du diese zugewiesen hast.


Wenn du den Namen der Funktion möchtest, musst du etwas Aufwand betreiben. Hier mal ein Ansatz, der aber alles andere als praktikabel ist, wie aus dem code ersichtlich wird:

Code:
function Logger() {
  this.debug = function(msg, obj) {
    I.write(msg,"debug", obj);
  };

  this.warn = function(msg) {
    I.write(msg, "warn");
  };
  
  this.write = function(msg, level, obj) {
    var all_caller = [];
	var c = arguments.callee.caller;
	var f_name;
	var f_ref;
	while(c) {
		all_caller.push(c);
		c = c.arguments.callee.caller;
	}
	document.write(all_caller.join('<br>') + '<hr>')
	f_ref = all_caller.pop();
	if(obj) {
		for(var a in obj) if(obj[a] === f_ref) f_name = a;
	}
	document.write(f_name + '<hr>')
  };
  
  var I = this;
}


function Klasse() {
  var log = new Logger();
  
  this.sayHiInLog = f;
  function f() {
    log.debug("Ich bin eine Debug Nachricht", this); 
  };
}
// Das funktioniert 
var k = new Klasse();
k.sayHiInLog()

// Das nicht.
(function main() {
var k = new Klasse();
k.sayHiInLog()
})();
 
Zuletzt bearbeitet von einem Moderator:
Okaaaay. :D Ich glaube so wichtig ist mir der Funktionsname dann doch nicht. Vor allem kostet das ja wieder alles Ressourcen beim durchgehen aller caller. Aber vielen Dank für den Hinweis, wie es denn gehen könnte :)
 
Zurück
Oben