javascript - Cómo acceder a los números de línea al envolver Firebug(o similar) Consola api
logging console (5)
Normalmente, al usar las funciones de depuración () o error () en lugar de registro () se mostrarán los números de línea. Creo que la consola de Google Chrome funciona de manera similar. ( referencia de Firebug )
He envuelto la API de la consola para proporcionar niveles de registro granulares, así como algunas otras características de azúcar.
Esto funciona bien, el único problema es que Firebug (o cualquier otra consola) siempre informará el número de línea del que proviene el registro como la línea en la que se invoca la API de la consola.
¿Cómo sugeriría que haga que la consola registre el número de línea al que llamo mi función contenedora?
Preferiría una solución de navegador cruzado pero, en su defecto, un plugin de Firebug podría ser un buen comienzo.
fyi llamo mi función de loge como así:
db.log(db.LogLevel.WARN, "Blah Blah Blah");
Problema interesante ... Es posible que tenga un truco para ti. No puedo probar esto ahora, pero creo que podría funcionar.
Sabemos que una llamada a función normal no funcionará, así que comencé a pensar en #defines en C y macros en varios otros idiomas. Desafortunadamente, javascript no tiene esto, pero quizás un hack de eval
funcionará . Estoy esperando que eval
ejecute el código como si proviniera de la misma línea; si no, bleh, ignore el resto de esta respuesta.
Mi método funciona así:
- Cambie su función db.log para apuntar a
eval
(sí, ew) - En lugar de pasar sus LogLevels como argumento, cree funciones para cada uno de ellos que devuelva una cadena con
console.log
y un mensaje personalizado.
Debería verse algo como esto:
db = {LogLevel: {}};
db.log = eval;
db.LogLevel.warn = function(message) {
return "console.log(''THIS IS A WARNING: " + message + "'');";
};
Deberías poder llamarlo así ahora:
db.log(db.LogLevel.warn("Blah blah blah"));
Así que esto surgió recientemente nuevamente, así que decidí volver a visitarlo.
Ahora que soy mayor y más sabio, tengo clara una solución mucho mejor, entonces lo que estaba tratando de hacer es llamar a las funciones de la consola tal como son pero reemplazarlas selectivamente con funciones ficticias cuando se baja el nivel. Esto me da un registro detallado y un número de línea preciso. Se han perdido algunas características de mi solución anterior, pero creo que este es un compromiso aceptable.
Aquí hay un recorte parcial de mi nueva lib de registro que muestra la solución principal
...
levels : ["debug","info","warn","error"],
init : function(minLevel) {
var params = abm.getUrlParams();
minLevel = params["debug"] || minLevel;
//TODO: firebug lite
window.console = window.console || {};
var clear = false;
for (var i=0; i<self.levels.length; i++) {
var level = self.levels[i];
originalFunctions[i] = originalFunctions[i]
|| console[level] || fallback;
if (level && (clear || level===minLevel)) {
console[level] = originalFunctions[i];
clear=true;
} else {
console[level] = suppressed(level);
}
}
}
...
Puedes ver todo aquí: https://github.com/antiBaconMachine/abm-log
//trust me, this way rocks! Auto prepend a logHead, yet keep correct line number displayed debug view.
//Output sample:
// 5/10 1:13:52.553 hi a.js:100
// 5/10 1:13:52.553 err b.js:200
var Log = {
debug : true,
/*
* log.d(logData1, logData2, ...)
* --> console.log( getLogHead(), logData1, logData2, ...)
*
* @comment Using bind and property accesser
* @see http://ejohn.org/blog/javascript-getters-and-setters/
*/
get d() {
if ( !this.debug) return _emptyFunc;
return console.log.bind( console, this._getLogHeader() );
},
/*
* output error info
*/
get e() {
return console.error.bind( console, this._getLogHeader() );
},
/**
* get current time in 01/31 23:59:59.999 format
*/
_getLogHeader : function () {
var millisec = Date.now();
this._dtNow.setTime( millisec );
//toLocaleString is 2013/01/31 23:59:59
return this._dtNow.toLocaleString().slice( 5 ) + ''.'' + (''000'' + millisec).slice( -3 ) + '' '';
},
_dtNow: new Date(),
_emptyFunc: function() {}
};
//enjoy it !
Log.d(''hi'');
Log.e(''err'');
Aquí hay dos formas de ajustar el registro sin perder el contexto. El primero es un poco feo por parte de la persona que llama. El segundo solo se puede usar si no necesita los detalles de lo que se registró.
Vea el JSFiddle para una demostración: http://jsfiddle.net/epQ95/1/
// logger method 1: allows for fully functional log-wrapping without losing context,
// but, it is very ugly from the caller''s perspective.
var debug = function () {
// do my extra special stuff
window.console.log("logging to server 1: ", arguments);
// do regular console logging, if possible
if (window.console && window.console.log) {
return window.console.log.apply.bind(window.console.log, window.console, arguments);
} else {
return function () {};
}
};
// caller
debug("logger method", 1)();
// logger method 2: pretty calling, but you don''t know what was logged,
// just that something definitely was.
var Logger = {};
Logger.__defineGetter__("debug", function () {
// do my extra special stuff
window.console.log("logging to server 2: don''t know what was logged");
// do regular console logging, if possible
if (window.console && window.console.log) {
return console.log.bind(window.console);
} else {
return function () {};
}
});
// caller
Logger.debug("logger method", 2);