我已经封装了控制台API以提供细粒度日志记录级别以及少数其他糖特征。如何在包装Firebug(或类似的)控制台API时访问行号码
这工作正常,唯一的问题是,萤火虫(或任何其他控制台)将始终报告日志的行号作为控制台API本身被调用的行。
你会如何建议我让控制台记录我称之为包装函数的行号?
我更喜欢跨浏览器的解决方案,但未能通过萤火虫插件可能是一个好的开始。
FYI我打电话给我的登录电子功能,像这样:
db.log(db.LogLevel.WARN, "Blah Blah Blah");
我已经封装了控制台API以提供细粒度日志记录级别以及少数其他糖特征。如何在包装Firebug(或类似的)控制台API时访问行号码
这工作正常,唯一的问题是,萤火虫(或任何其他控制台)将始终报告日志的行号作为控制台API本身被调用的行。
你会如何建议我让控制台记录我称之为包装函数的行号?
我更喜欢跨浏览器的解决方案,但未能通过萤火虫插件可能是一个好的开始。
FYI我打电话给我的登录电子功能,像这样:
db.log(db.LogLevel.WARN, "Blah Blah Blah");
所以这个最近又上来,所以我决定重新审视它。
现在我年纪大了,明智一些,这对我来说是一个更好的解决方案,然后我试图做的是调用控制台功能,但在关闭关卡时选择性地用虚拟函数替换它们。这给我细粒度的记录和准确的线路报告。我以前的解决方案已经失去了一些功能,但我认为这是一个可接受的折中方案。
这是我的新记录11b的部分剪断这说明主要解决
...
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);
}
}
}
...
你可以看到完整的东西在这里:https://github.com/antiBaconMachine/abm-log
通常使用调试()或错误(),而不是日志()函数会导致行号显示。我相信Google Chrome控制台的作用相似。 (firebug reference)
这不是显示行号的问题,而是显示右行号的问题。所有的日志函数都显示调用日志函数的行号,在我的情况下,因为我已经包装了这个函数,它总是显示相同的行号。 – 2010-11-09 11:58:17
您开始离开javascript功能的范围 - 请问您要做什么?解决?调试? – 2010-11-09 18:39:52
有趣的问题...我可能会为你破解。我现在无法测试这个,但我认为它可能有效。
我们知道常规的函数调用将不起作用,所以我开始考虑C语言中的#defines以及各种其他语言中的宏。不幸的是,JavaScript没有这个,但也许eval
黑客将工作。我期待eval
将运行代码,就好像它来自同一行 - 如果没有,bleh,忽略此答案的其余部分。
我的方法是这样的:
eval
(是的,EW)console.log
的字符串和一条自定义消息。它应该是这个样子:
db = {LogLevel: {}};
db.log = eval;
db.LogLevel.warn = function(message) {
return "console.log('THIS IS A WARNING: " + message + "');";
};
您应该现在能够这样称呼它:
db.log(db.LogLevel.warn("Blah blah blah"));
有趣的想法,开箱即用,精彩绝伦的思维。这是因为大多数浏览器不会让你别名eval作为安全功能。在IE中它的工作原理与上述相同调用eval可能是一种解决方法,但我认为这会开始削弱首先包装控制台的实用性。虽然很努力。 – 2010-12-14 09:22:39
@奥利爱德华兹 - 我的错,因为没有正确测试它!我在firefox和chrome中查了一下今天,虽然你是对的,但是有安全限制,看起来只有当你改变'eval'的**上下文**。因此,如果您不将'log'赋值给'db'对象(只是全局创建它),那么您可以使用'eval'来替代它。 – 2010-12-15 01:15:29
//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');
看起来很有趣我会玩一玩 – 2013-05-16 10:52:39
这里有包日志不失两种方式上下文。第一个来自呼叫方的一点有点丑陋。第二个只有在你不需要记录的细节时才可用。
见的jsfiddle了演示: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);
这将是更好,如果你能解释一下你精心期待什么。你想获得你的函数的行号吗? – 2010-12-02 14:09:52