2011-07-22 9 views
9

Quiero hacer una función, como esta.javascript registro de consola abstracta

Por ejemplo:

function Logger() { 
    this.log = function(msg) { 
     console.log(msg); 
    } 
} 

Y quiero utilizarlo en funciones/módulos, etc, y que todo funciona bien. Pero la consola predeterminada en mi navegador normalmente da el fileName + lineNumber.

Ahora cuando abstrae esta funcionalidad, el fileName y lineNumber no es donde puse mi instance.log(). Porque indicará desde dónde se llama a console.log, no la función en sí.

Así que mi pregunta:

¿Cómo puedo obtener la información correcta desde donde yo quiero usar mi registrador? O dame, por favor, cualquier consejo para mejorar esta funcionalidad.

+0

¿Qué aplicación de registro estás usando que pone el número de línea y el nombre del archivo? – ar3

+0

Inspector por defecto, disponible para Chrome, Safari, etc. – Barry

Respuesta

0

Intente utilizar la función traza como éste:

function printStackTrace() { 
    var callstack = []; 
    var isCallstackPopulated = false; 
    try { 
     i.dont.exist += 0; //doesn't exist- that's the point 
    } catch (e) { 
     if (e.stack) { //Firefox 
      var lines = e.stack.split('\n'); 
      for (var i = 0, len = lines.length; i & lt; len; i++) { 
       if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { 
        callstack.push(lines[i]); 
       } 
      } 
      //Remove call to printStackTrace() 
      callstack.shift(); 
      isCallstackPopulated = true; 
     } 
     else if (window.opera & amp; & amp; e.message) { //Opera 
      var lines = e.message.split('\n'); 
      for (var i = 0, len = lines.length; i & lt; len; i++) { 
       if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) { 
        var entry = lines[i]; 
        //Append next line also since it has the file info 
        if (lines[i + 1]) { 
         entry += ' at ' + lines[i + 1]; 
         i++; 
        } 
        callstack.push(entry); 
       } 
      } 
      //Remove call to printStackTrace() 
      callstack.shift(); 
      isCallstackPopulated = true; 
     } 
    } 
    if (!isCallstackPopulated) { //IE and Safari 
     var currentFunction = arguments.callee.caller; 
     while (currentFunction) { 
      var fn = currentFunction.toString(); 
      var fname = fn.substring(fn.indexOf(& amp; quot; 

      function & amp; quot;) + 8, fn.indexOf('')) || 'anonymous'; 
      callstack.push(fname); 
      currentFunction = currentFunction.caller; 
     } 
    } 
    output(callstack); 
} 

function output(arr) { 
    //Optput however you want 
    alert(arr.join('\n\n')); 
} 
+0

Gracias, ¿podría ser más específico, qué hace exactamente, cuándo o cómo usarlo? – Barry

0

intente asignar la función:

(function() { 
    window.log = (console && console.log 
     ? console.log 
     : function() { 
       // Alternative log 
      }); 
})(); 

tarde sólo llamar log('Message') en el código.

Cuestiones relacionadas