Ich verwende ELMAH, um meine .net-Fehler zu protokollieren. Es funktioniert gut, aber ich möchte die Fehlerprotokollierung erweitern, um clientseitige Fehler, d.h. willkürliche JavaScript-Fehler, einzubeziehen. Ich kann die Fehler mit dem window.onerror-Ereignis erfassen und dann einen .net-Handler (.ashx) aufrufen, um den Fehler in elmah zu protokollieren, aber das ist nur mein kleiner Hack, um das Problem zu lösen. Gibt es eine bessere Möglichkeit, clientseitige Fehler bei elmah zu protokollieren?Clientseitige Fehlerprotokollierung mit Elmah
Antwort
fangen alle JavaScript-Fehler durch die window.onerror Event-Handling und Ajax-Aufruf machen, um manuell Fehler melden Sie sich an ELMAH
window.onerror = function (msg, url, linenumber) {
//make ajax call with all error details and log error directly into the elmah database
//show freindly error msg here to user
//hide error from browser
return true;
}
Nein zu dieser Zeit wurde eine bessere Lösung gefunden.
Werfen Sie einen Blick auf hoptoadapp.com und wie sie Javascript-Berichterstattung machen.
Es ist genau das gleiche, aber ein anderes Backend :-)
Das sieht gut aus! Warum habe ich nicht schon früher davon gehört? :-) –
Gut, dass ich helfen konnte! Könnten Sie die Frage als akzeptiert markieren? ;-) – changelog
Hier ist eine vollständigere Lösung (ich glaube ich es von der ELMAH Website packte ... kann mich nicht erinnern)
ErrorLogging.js:
window.onerror = function (msg, url, line) {
logError(msg, arguments.callee.trace());
}
function logError(ex, stack) {
if (ex == null) return;
if (logErrorUrl == null) {
alert('logErrorUrl must be defined.');
return;
}
var url = ex.fileName != null ? ex.fileName : document.location;
if (stack == null && ex.stack != null) stack = ex.stack;
// format output
var out = ex.message != null ? ex.name + ": " + ex.message : ex;
out += ": at document path '" + url + "'.";
if (stack != null) out += "\n at " + stack.join("\n at ");
// send error message
jQuery.ajax({
type: 'POST',
url: logErrorUrl,
data: { message: out }
});
}
Function.prototype.trace = function()
{
var trace = [];
var current = this;
while(current)
{
trace.push(current.signature());
current = current.caller;
}
return trace;
}
Function.prototype.signature = function()
{
var signature = {
name: this.getName(),
params: [],
toString: function()
{
var params = this.params.length > 0 ?
"'" + this.params.join("', '") + "'" : "";
return this.name + "(" + params + ")"
}
};
if (this.arguments)
{
for(var x=0; x<this.arguments.length; x++)
signature.params.push(this.arguments[x]);
}
return signature;
}
Function.prototype.getName = function()
{
if (this.name)
return this.name;
var definition = this.toString().split("\n")[0];
var exp = /^function ([^\s(]+).+/;
if (exp.test(definition))
return definition.split("\n")[0].replace(exp, "$1") || "anonymous";
return "anonymous";
}
Layout/Master-Seite:
<script src="@Url.Content("~/Scripts/ErrorLogging.js")" type="text/javascript"></script>
<script type="text/javascript">
//This needs to be here to be on everypage
var logErrorUrl = '@Url.Action("LogJavaScriptError", "Home")';
</script>
HomeController.cs:
[HttpPost]
public void LogJavaScriptError(string message) {
ErrorSignal.FromCurrentContext().Raise(new JavaScriptErrorException(message));
}
JavaScriptErrorException.cs:
[Serializable]
public class JavaScriptErrorException: Exception{
public JavaScriptErrorException(string message) : base (message){}
}
Funktioniert nicht. 'msg' ist ein String, er enthält nicht die Felder fileName, stack ...' arguments.callee.trace() 'gibt nur den vorherigen Aufruf zurück (zB den onerror-Handler). – Gabriel
Es funktioniert.msg enthält alle Informationen abzüglich des Aufruf-Stacks. Es teilt Ihnen die Zeilennummer und den Fehler mit. Beispiel: JavaScriptErrorException: Uncaught TypeError: Objekt [Objekt-Array] hat keine Methode 'Verbergen': im Dokumentpfad 'http: // xxxx/Reports/TableBreakdown? StartDate = 02% 2F27% 2F2013% 2009% 3A44% 3A46 & endDate = 03 % 2F27% 2F2013% 2009% 3A44% 3A46 & zusammenbruch = TopIssues '. at anonymous ('Uncaught TypeError: Objekt [object Array] hat keine Methode' hide '', 'http: // xxxx/Reports/TableBreakdown'? startDate = 02% 2F27% 2F2013% 2009% 3A44% 3A46 & endDate = 03% 2F27% 2F2013 % 2009% 3A44% 3A46 & zusammenbruch = TopIssues ',' 130 ') – rbj325
einen Blick auf diese.
http://joel.net/logging-errors-with-elmah-in-asp.net-mvc-3--part-5--javascript
Die einzige Modifikation I ging es um die Bündelung des obigen Code zu machen hatte.
I ersetzt
... mit @ Scripts.Render ("~/stacktrace.js")
Und in meinem Bündel Config habe ich die Linie ... bundles.Add (new ScriptBundle ("~/stacktrace.js"). Include ("~/Scripts/stacktrace.js"));
Dies macht den Code kompatibel mit der neueren MVC 4 Bündelung.
und ich würde auch gerne in der Lage sein, klassische ASP-Fehler zu protokollieren –
bekam ein interessantes bisschen Javascript gehen jetzt Fehler zu erfassen, die einfach auf jeder Seite enthalten sein kann, aber es fühlt sich immer noch wie ein Hack –
hallo Daniel könnte Sie posten das Javascript, das Sie dafür verwenden? –