ELMAH: Módulo de Error Logging para ASP.NET
Hola que tal, hace poco leyendo un post de Scott Hanselman, y me llamó la atención ELMAH
ELMAH: Error Logging Modules and Handlers for ASP.NET (and MVC too!)
¿Qué es ELMAH?
Es un plugin para el registro persistente de errores , se puede agregar a una aplicación ASP.NET en ejecución o a todas las aplicaciones Web ASP.NET en un equipo, sin necesidad de recompilar.
Una vez que ELMAH esté instalado y configurado adecuadamente permite:
- Registro de las excepciones no controladas
- Una página web para ver el registro de todas las excepciones de manera remota
- Una página web para ver el detalle de cada excepción registrada
- En muchos casos , vas a poder revisar la pantalla original de la excepción,incluso si customErrors mode esta en off
- Posibilidad de enviar notificaciones de cada excepción por email en el momento que ocurren
- Contar con un fuente RSS con los últimos 15 errores del log.
Más características Cool
Posibilidad de registrar el log generado en:
Revisa el website oficial para revisar todas las excelentes características que nos brinda
http://code.google.com/p/elmah/
Manos a la Obra
Una vez descargado ELMAH, hice referencia a los ensamblados, en el caso del ejemplo , hice ref. a todos (para hacer el pruebas).

Ahora a modificar el WebConfig, es bastante sencillo, viene todo explicado en la aplicación de ejemplo que viene junto a los ensamblados.
En el siguiente website puedes ver la documentación sobre estas opciones y cuando implementarlas, yo quiero dar una ayuda rápida de instalación simplemente.
http://code.google.com/p/elmah/wiki/DotNetSlackersArticle
Paso 1 Agregar:
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false"
type="Elmah.SecuritySectionHandler, Elmah" />
<section name="errorLog" requirePermission="false"
type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false"
type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false"
type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>
</configSections>
Paso 2 Agregar:
<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
Paso 3 Agregar
<system.web>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
</httpModules>
</system.web>
Ahora bien para almacenar la info de log en los distintos tipos de almacenamiento vamos a agregar en el WebConfig:
En un archivo XML
<elmah>
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data" />
</elmah>
En Memoria
Muy rápido, pero limitado, obviamente no persiste.
<elmah>
<errorLog type="Elmah.MemoryErrorLog, Elmah" size="50" />
</elmah>
En SQL Lite
Si no sabes lo que es Sql Lite, te cuento que es un pequeño motor de base de datos, muy muy liviano y eficiente para tareas sencillas.
<connectionStrings>
<add name="Elmah.SQLite" connectionString="data
source=~/App_Data/Elmah.SQLite.db" />
</connectionStrings>
<elmah>
<errorLog type="Elmah.SQLiteErrorLog, Elmah" connectionStringName="Elmah.SQLite" />
</elmah>
Te recomiendo el livianisimo SQL Lite Administrator para administrar tu BD de SQL Lite. Es muy simple, portable y light. En la imagen siguiente vemos la vista de la BD que guarda el log, tu no tienes que hacer absolutamente nada, me refiero a que no tienes para que crear la base, ELMAH lo hace por tí.
En SQL Server
La aplicación de ejemplo se adjunta con un Script SQL para que generes la estructura necesaria para dar soporte a ELMAH. Esta es la mejor opción para entornos corporativos.
<connectionStrings>
<add name="Elmah.Sql"
connectionString="Data Source=.;Initial Catalog=ELMAH;Trusted_Connection=True" />
</connectionStrings>
<elmah>
<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="Elmah.Sql" />
</elmah>
¿Y si no quiero todos las excepciones registradas?
Puedes filtrar programática o declarativamente. Teniendo en cuenta la estructura de la clase y su funcionamiento,
La propiedad Dismissed indica si la excepción ha sido desestimada o no, mientras que la propiedad de Excepción contiene la excepción no manejada.
El método Dismmiss marca la excepción que no vamos a “estimar”, impidiendo que ser bien enviado por correo o registrado en el log.
Ejemplo:
void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
if(e.Exception.GetBaseException() is FileNotFoundException)
e.Dismiss();
}
Lo anterior, elimina (descarta) la notificación para la excepción FileNotFoundException.
Hay muchas otras opciones que te invito a revisar en:
http://code.google.com/p/elmah/wiki/DotNetSlackersArticle
Y ahora F5 en mi Aplicación!!!
Para botar la aplicación tengo una división por Cero en el botón.
y al presionarlo:
y ahora al visitar:
http://localhost:53257/pruebaLog/elmah.axd
tenemos a ELMAH en acción: (espero que se alcance a notar, quize pegar toda grilla para que se vean los campos.
Nos da una lista de las excepciones, con información relevante y además podemos ver el detalle de cada una.
Si ves el menú superior vamos a ver:
Podemos suscribir RSS :), entonces, por que no suscribirnos a la fuente RSS desde el gadget de Windows 7

Y ahora tenemos nuestro “sistema de monitoreo” de nuestra aplicación corriendo en el escritorio de Windows.
Espero que te sirva, a mi me gustó mucho :)
Saludos,
Gonzalo