我还推荐 log4javascript 并解释如何仍然保留有关打印文件名和行的信息,至少在 Chrome 中。
我不是在谈论更改 Chrome 打印的文件名和行,但您可以获取您感兴趣的信息并将其附加到日志语句中。我的解决方案是快速破解,但我认为通过更多的工作,您可以获得格式良好的日志语句。它可能还会对性能产生重大影响,但是由于您不会在生产中激活日志,因此这应该不是太大的问题。
这个概念
在 Chrome 中,您可以创建一个错误对象,该对象提供一个堆栈属性,该属性显示您当前的堆栈位置以及堆栈字符串中的某个位置,您可以找到调用脚本的文件和行号。
> new Error().stack
"Error
at eval at <anonymous> (eval at evaluate (unknown source))
at eval at evaluate (unknown source)
at FrameMirror.evaluate (native)
at Object.evaluate (unknown source)
at Object._evaluateOn (unknown source)
at Object._evaluateAndWrap (unknown source)
at Object.evaluateOnCallFrame (unknown source)
at meinAjaxAufruf (http://localhost:8080/numberajax.js:21:9)
at HTMLInputElement.onkeyup (http://localhost:8080/numberajax.html:15:188)"
对于 log4javascript 调用,堆栈跟踪可能如下所示:
"Error
at Object.append (http://localhost:8080/log4javascript_uncompressed.js:1921:17)
at Object.doAppend (http://localhost:8080/log4javascript_uncompressed.js:1047:9)
at Object.callAppenders (http://localhost:8080/log4javascript_uncompressed.js:647:27)
at Object.log (http://localhost:8080/log4javascript_uncompressed.js:640:10)
at Object.debug (http://localhost:8080/log4javascript_uncompressed.js:748:9)
at meinAjaxAufruf (http://localhost:8080/numberajax.js:36:16)
at HTMLInputElement.onkeyup (http://localhost:8080/numberajax.html:16:188)"
进行 log4javascript 调用并且我感兴趣的文件和行是
at meinAjaxAufruf (http://localhost:8080/numberajax.js:36:16)
解决方案
我猜测从您感兴趣的脚本到实际console
调用发生位置的堆栈深度总是相同的。所以现在你只需要找出BrowserConsoleAppender
它的window.console
访问位置并将你感兴趣的行添加到格式化的字符串中。我对log4javascript_uncompressed.js
(版本 1.4.2 第 1913 行)进行了以下更改:
} else if (window.console && window.console.log) { // Safari and Firebug
var formattedMesage = getFormattedMessage();
//---my additions
var isChrome = navigator.userAgent.indexOf("Chrome") !== -1;
if(isChrome){
var stack = new Error().stack;
var lineAccessingLogger = stack.split("\n")[6];
formattedMesage += "\n" + lineAccessingLogger;
}
//---
// Log to Firebug using its logging methods or revert to the console.log
// method in Safari
if (window.console.debug && Level.DEBUG.isGreaterOrEqual(loggingEvent.level)) {
window.console.debug(formattedMesage);
} else if (window.console.info && Level.INFO.equals(loggingEvent.level)) {
...
现在代替
17:53:22,872 DEBUG - sending /NumberServlet?zahl=1&text=
log4javascript.js:154
我明白了
17:55:53,008 DEBUG - sending /NumberServlet?zahl=1&text=
at meinAjaxAufruf (http://localhost:8080/numberajax.js:36:16) log4javascript_uncompressed.js:1930
这肯定不是一个好的解决方案:),但我得到了我需要的东西。
通过对框架的更多了解,我想可以更改 PatternLayout 的方式,您可以定义如何打印文件名/位置和行号。
编辑我对 PatternLayout.prototype.format 函数进行了一些修改,而不是我之前的解决方案,所以现在我可以使用附加选项 %l 来定义我想要输出调用文件及其行的位置和方式。我以Gist的形式发布了我的更改和使用示例。