また、log4javascript をお勧めし、少なくとも Chrome では、印刷されたファイル名と行に関する情報を保持する方法を説明します。
Chrome によって出力されるファイル名と行を変更することについて話しているわけではありませんが、関心のある情報を取得して、ログ ステートメントに追加することができます。私の解決策は簡単なハックでしたが、もう少し作業をすれば、適切にフォーマットされたログステートメントを取得できると思います。おそらくパフォーマンスにも大きな影響がありますが、本番環境でログを有効にしたままにしないので、これはそれほど問題にはなりません。
コンセプト
Chrome では、現在のスタックの場所を示すスタック プロパティを提供する Error オブジェクトを作成し、スタック文字列のどこかに呼び出しスクリプトのファイルと行番号を見つけることができます。
> 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として公開しました。