Estoy usando ELMAH para registrar mis errores .net. Está funcionando muy bien, pero quiero extender el registro de errores para incluir errores del lado del cliente, es decir, errores arbitrarios de JavaScript. Puedo capturar los errores usando el evento window.onerror y luego llamar a un controlador .net (.ashx) para registrar el error en elmah, pero este es solo mi pequeño truco para resolver el problema. ¿Hay alguna forma mejor de registrar el error del lado del cliente en elmah?Clientside error logging using Elmah
Respuesta
captura todos los errores de javascript por controlar el evento y hacer window.onerror llamada AJAX para registrar manualmente error en 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;
}
n mejor solución se encontró en el momento.
Eche un vistazo a hoptoadapp.com y cómo hacen los informes de javascript.
Es exactamente lo mismo, pero un motor diferente :-)
¡Esto se ve muy bien! ¿Por qué no he escuchado antes sobre esto? :-) –
¡Qué bueno que podría ayudar! ¿Podría marcar la pregunta como aceptada? ;-) – changelog
Aquí es una solución más completa (creo que lo agarré del sitio ELMAH ... no recuerdo)
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";
}
Formato/página maestra:
<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){}
}
No funciona. 'msg' es una cadena, no contiene los campos nombreArchivo, pila ...' arguments.callee.trace() 'devolverá solo la llamada anterior (es decir, el controlador onerror). – Gabriel
Funciona.msg contiene toda la información menos la pila de llamadas. Le dice el número de línea y el error. Por ejemplo: JavaScriptErrorException: UnEught TypeError: Object [object Array] no tiene el método 'hide': en la ruta del documento 'http: // xxxx/Reports/TableBreakdown? StartDate = 02% 2F27% 2F2013% 2009% 3A44% 3A46 & endDate = 03 % 2F27% 2F2013% 2009% 3A44% 3A46 y desglose = TopIssues '. at anonymous ('Unkeught TypeError: Object [object Array] no tiene el método' hide '', 'http: // xxxx/Reports/TableBreakdown? startDate = 02% 2F27% 2F2013% 2009% 3A44% 3A46 & endDate = 03% 2F27% 2F2013 % 2009% 3A44% 3A46 y desglose = TopIssues ',' 130 ') – rbj325
miren esto.
http://joel.net/logging-errors-with-elmah-in-asp.net-mvc-3--part-5--javascript
La única modificación que tenía que hacer para que el código anterior se refería a la agrupación.
que sustituyen
... con @ Scripts.Render ("~/stacktrace.js")
Y en mi config paquete añadí la línea ... bundles.Add (nuevo ScriptBundle ("~/stacktrace.js"). Include ("~/Scripts/stacktrace.js"));
Esto hace que el código sea compatible con la nueva agrupación MVC 4.
- 1. C# error de captura using
- 2. entendiendo "error de ejecución de diseño" logging
- 3. Error 404 FavIco del bloque en ELMAh
- 4. Logging * Business * Events - use logging framework?
- 5. jQuery ajax request using jsonp error
- 6. Java: SSL Clientside Authentication con certificados autofirmados
- 7. slf4j logging sintaxis
- 8. Fetch Datos formulario External URL clientside
- 9. Elmah no registra excepciones
- 10. Elmah no registraba HttpRequestValidationException
- 11. SynchronizationLockException + Logging
- 12. Pyramid logging
- 13. Glassfish Logging
- 14. Logging NSNotifications
- 15. JBoss AS 7: Logging
- 16. Error-logging para javascript en el lado del cliente
- 17. Configuración ELMAH: la sección de configuración de error no reconocido
- 18. ELMAH dentro de una página de error temática
- 19. elmah: excepciones sin HttpContext?
- 20. Ant: Logging via Log4j
- 21. Logging with Vala
- 22. Python Logging setlevel
- 23. Clojure tools.logging no logging stacktrace
- 24. .Net Web Service Logging
- 25. NoClassDefFoundError con clojure tools logging
- 26. rieles logging simplemente no funciona
- 27. Rails Logging API
- 28. python logging alternatives
- 29. C logging libraries
- 30. Spring hibernate Transaction Logging
y también me gustaría poder registrar errores clásicos de asp –
tengo un poco de javascript interesante ahora para capturar errores que simplemente pueden incluirse en cualquier página, pero todavía se siente como un truco –
hola Daniel, podría ¿publicas el javascript que estás utilizando para esto? –