¿Es posible hacer lo siguiente usando ELMAH?
logger.Log(" something");
Estoy haciendo algo como esto:
try
{
// Code that might throw an exception
}
catch(Exception ex)
{
// I need to log error here...
}
ELMAH no registrará automáticamente esta excepción porque se manejó.
Respuestas:
Método de escritura de registro directo, trabajando desde ELMAH 1.0:
ELMAH 1.2 presenta una API más flexible:
Hay una diferencia entre las dos soluciones:
Raise
El método aplica las reglas de filtrado de ELMAH a la excepción.Log
El método no lo hace.Raise
se basa en la suscripción y puede registrar una excepción en varios registradores.fuente
Elmah.ErrorLog.Log()
: se produce en caso de que la llamada de registro en sí misma falle, posiblemente derribando toda la aplicación web.Raise()
falla en silencio Por ejemplo: si hay un problema de configuración incorrecta en el lado del servidor (por ejemplo, Elmah está configurado para guardar los errores en el disco, pero no tiene el acceso correcto a la carpeta de registros), el.Log()
método arrojará. (Sin embargo, esto es bueno para la depuración, por ejemplo, ¿por qué no se.Raise()
registra nada?)Recomiendo encapsular la llamada a Elmah en una clase de envoltura simple propia.
Luego, simplemente llámelo cuando necesite registrar un error.
Esto tiene los siguientes beneficios:
Nota: He agregado una propiedad 'contextualMessage' para información contextual. Puede omitir esto si lo prefiere, pero me parece muy útil. Elmah desenvuelve automáticamente las excepciones, por lo que la excepción subyacente aún se informará en el registro, pero el mensaje contextual será visible cuando haga clic en él.
fuente
// uh oh! just keep going
. Si mi manejo de errores falla, quiero saberlo. Quiero que haga algo de ruido.Puede usar el método Elmah.ErrorSignal () para registrar un problema sin generar una excepción.
fuente
fuente
Sí, es posible. ELMAH fue diseñado para interceptar excepciones no manejadas. Sin embargo, puede señalar una excepción a ELMAH a través de la clase ErrorSignal. Esas excepciones no se lanzan (no burbujean), sino que solo se envían a ELMAH (y a los suscriptores del evento Raise de la clase ErrorSignal).
Un pequeño ejemplo:
fuente
Estaba buscando hacer lo mismo en un hilo en el que había comenzado a poner en cola el correo desde mi aplicación MVC4, por lo que no tenía el HttpContext disponible cuando se produjo una excepción. Para hacer esto, terminé con lo siguiente basado en esta pregunta y otra respuesta encontrada aquí: elmah: ¿excepciones sin HttpContext?
En el archivo de configuración especifiqué un nombre de aplicación:
Luego, en el código (como la respuesta proporcionada anteriormente, pero sin el HttpContext) puede pasar nulo en lugar de un HttpContext:
fuente
packages.config
ves? ¿Ves algo como<package id="elmah" version="1.2.2" targetFramework="net45" />
<package id="elmah.corelibrary" version="1.2.2" targetFramework="net45" />
<package id="elmah.sqlserver" version="1.2" targetFramework="net45" />'
:? ¿Instalaste con NuGET?packages.config
A veces
CurrentHttpContext
puede no estar disponible.Definir
Utilizar
fuente
Estoy en ASP.NET core y uso ElmahCore .
Para registrar errores manualmente con HttpContext (en el controlador) simplemente escriba:
En otra parte de su aplicación sin HttpContext :
fuente
Intenté escribir mensajes personalizados en los registros de elmah usando Signal.FromCurrentContext (). Raise (ex); y descubrimos que estas excepciones aparecen, por ejemplo:
Además, no veo cómo elmah admite diferentes niveles de registro: ¿es posible desactivar el registro detallado mediante una configuración web.config?
fuente
Usé esta línea y funciona perfectamente bien.
fuente