Registrar detalles de error con Supervisión de estado de ASP.NET (C#)

por Scott Mitchell

El sistema de supervisión de estado de Microsoft proporciona una manera fácil y personalizable de registrar varios eventos web, incluidas las excepciones no controladas. En este tutorial se explica cómo configurar el sistema de supervisión de estado para registrar excepciones no controladas en una base de datos y notificar a los desarrolladores con un mensaje de correo electrónico.

Introducción

El registro es una herramienta útil para supervisar el estado de una aplicación implementada y para diagnosticar cualquier problema que pueda surgir. Es muy importante registrar errores que se produzcan en una aplicación implementada para que se puedan solucionar. El evento Error se genera cada vez que se produce una excepción no controlada en una aplicación de ASP.NET; en el tutorial anterior se muestra cómo notificar a un desarrollador un error y registrar sus detalles mediante la creación de un controlador de eventos para el evento Error. Sin embargo, la creación de un controlador de eventos Error para registrar los detalles del error y notificar a un desarrollador no es necesario, ya que el sistema de supervisión de estado de ASP.NET puede realizar esta tarea.

El sistema de supervisión de estado se introdujo en ASP.NET 2.0 y está diseñado para supervisar el estado de una aplicación implementada ASP.NET registrando eventos que se producen durante la vigencia de la aplicación o solicitud. Los eventos registrados por el sistema de supervisión de estado se conocen como eventos de supervisión de estado o eventos web, e incluyen:

  • Eventos de duración de la aplicación, como cuando se inicia o detiene una aplicación
  • Eventos de seguridad, incluidos los intentos de inicio de sesión erróneos y las solicitudes de autorización de direcciones URL con errores
  • Errores de aplicación, incluidas excepciones no controladas, excepciones de análisis de estado de vista, excepciones de validación de solicitudes y errores de compilación, entre otros tipos de errores.

Cuando se genera un evento de supervisión de estado, se puede registrar en cualquier número de orígenes de registro especificados. El sistema de supervisión de estado se incluye con orígenes de registro que registran eventos web en una base de datos de Microsoft SQL Server, en el registro de eventos de Windows o a través de un mensaje de correo electrónico, entre otros. También puede crear sus propios orígenes de registro.

Los eventos que registra el sistema de supervisión de estado, junto con los orígenes de registro usados, se definen en Web.config. Con algunas líneas de marcado de configuración, puede usar la supervisión de estado para registrar todas las excepciones no controladas en una base de datos y notificarle la excepción por correo electrónico.

Exploración de la configuración del sistema de supervisión de estado

El comportamiento del sistema de supervisión de estado se define mediante su información de configuración, que se encuentra en el elemento <healthMonitoring> de Web.config. Esta sección de configuración define, entre otras cosas, estos tres elementos importantes de información:

  1. Los eventos de supervisión de estado que, cuando se generan, deben registrarse,
  2. Los orígenes de registro; y
  3. Cómo se asigna cada evento de supervisión de estado definido en (1) a los orígenes de registro definidos en (2).

Esta información se especifica a través de tres elementos de configuración secundarios: <eventMappings>, <providers> y <rules>, respectivamente.

La información de configuración del sistema de supervisión de estado predeterminada se puede encontrar en el archivo Web.config de la carpeta %WINDIR%\Microsoft.NET\Framework\version\CONFIG. Esta información de configuración predeterminada, con algún marcado quitado para mayor brevedad, se muestra a continuación:

<configuration>
  <system.web>
  <healthMonitoring>
  <eventMappings>
  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>

  <add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
  </eventMappings>

  <providers>
  <add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>

  <add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>

  <rules>
  <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>

  <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

Los eventos de supervisión de estado de interés se definen en el elemento <eventMappings>, que proporciona un nombre descriptivo a una clase de eventos de supervisión de estado. En el marcado anterior, el elemento <eventMappings> asigna el nombre descriptivo "Todos los errores" a los eventos de supervisión de estado de tipo WebBaseErrorEvent y el nombre "Auditorías de errores" a eventos de supervisión de estado de tipo WebFailureAuditEvent.

El elemento <providers> define los orígenes de registro, lo que les proporciona un nombre descriptivo para el usuario y especifica cualquier información de configuración específica del origen del registro. El primer elemento <add> define el proveedor "EventLogProvider", que registra los eventos de supervisión de estado especificados mediante la clase EventLogWebEventProvider. La clase EventLogWebEventProvider registra el evento en el registro de eventos de Windows. El segundo elemento <add> define el proveedor "SqlWebEventProvider", que registra eventos en una base de datos de Microsoft SQL Server a través de la clase SqlWebEventProvider. La configuración "SqlWebEventProvider" especifica la cadena de conexión de la base de datos (connectionStringName) entre otras opciones de configuración.

El elemento <rules> asigna los eventos especificados en el elemento <eventMappings> para registrar orígenes en el elemento <providers>. De forma predeterminada, las aplicaciones web de ASP.NET registran todas las excepciones no controladas y los errores de auditoría en el registro de eventos de Windows.

Registro de eventos en una base de datos

La configuración predeterminada del sistema de supervisión de estado se puede personalizar para cada aplicación web agregando una sección <healthMonitoring> al archivo Web.config de la aplicación. Puede incluir elementos adicionales en las secciones <eventMappings>, <providers> y <rules> mediante el elemento <add>. Para quitar un valor de la configuración predeterminada, use el elemento <remove> o use <clear /> para quitar todos los valores predeterminados de una de estas secciones. Vamos a configurar la aplicación web Book Reviews para registrar todas las excepciones no controladas en una base de datos de Microsoft SQL Server mediante la clase SqlWebEventProvider.

La clase SqlWebEventProvider forma parte del sistema de supervisión de estado y registra un evento de supervisión de estado en una base de datos de SQL Server especificada. La clase SqlWebEventProvider espera que la base de datos especificada incluya un procedimiento almacenado denominado aspnet_WebEvent_LogEvent. Este procedimiento almacenado se pasa los detalles del evento y se encarga de almacenar los detalles del evento. La buena noticia es que no es necesario crear este procedimiento almacenado ni la tabla para almacenar los detalles del evento. Puede agregar estos objetos a la base de datos mediante la herramienta aspnet_regsql.exe.

Nota:

La herramienta aspnet_regsql.exe se explicó de nuevo en el tutorial Configuración de un sitio web que usa servicios de aplicación cuando se agregó compatibilidad para los servicios de aplicación de ASP.NET. Por lo tanto, la base de datos del sitio web de Book Reviews ya contiene el procedimiento almacenado aspnet_WebEvent_LogEvent, que almacena la información del evento en una tabla denominada aspnet_WebEvent_Events.

Una vez que tenga el procedimiento almacenado y la tabla necesarios agregados a la base de datos, lo único que queda es indicar a la supervisión de estado que registre todas las excepciones no controladas en la base de datos. Para ello, agregue el siguiente marcado al archivo Web.config de su sitio web:

<configuration>
  ...
  <system.web>
  ...
  <healthMonitoring enabled="true">
  <eventMappings>
  <clear />

  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
  startEventCode="0" endEventCode="2147483647" />
  </eventMappings>

  <providers>
  <clear />

  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
  </providers>

  <rules>
  <clear />

  <add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

El marcado de configuración de supervisión de estado anterior usa elementos <clear /> para borrar la información de configuración de supervisión de estado predefinida de las secciones <eventMappings>, <providers> y <rules>. A continuación, agrega una única entrada a cada una de estas secciones.

  • El elemento <eventMappings> define un único evento de supervisión de estado de interés denominado "Todos los errores", que se genera cada vez que se produce una excepción no controlada.
  • El elemento <providers> define un único origen de registro denominado "SqlWebEventProvider" que usa la clase SqlWebEventProvider. El atributo connectionStringName se ha establecido en "ReviewsConnectionString", que es el nombre de la cadena de conexión definida en la sección <connectionStrings>.
  • Por último, el elemento <rules> indica que cuando se produce un evento "Todos los errores", debe registrarse mediante el proveedor "SqlWebEventProvider".

Esta información de configuración indica al sistema de supervisión de estado que registre todas las excepciones no controladas en la base de datos de Book Reviews.

Nota:

El evento WebBaseErrorEvent solo se genera para los errores de servidor; no se genera para los errores HTTP, como una solicitud de un recurso de ASP.NET que no se encuentra. Esto difiere del comportamiento del evento Error de la clase HttpApplication, que se genera para los errores de servidor y HTTP.

Para ver el sistema de supervisión de estado en acción, visite el sitio web y genere un error en tiempo de ejecución visitando Genre.aspx?ID=foo. Debería ver la página de error adecuada: la pantalla amarilla de la muerte de los detalles de la excepción (durante una visita local) o la página de error personalizada (al visitar el sitio en producción). En segundo plano, el sistema de supervisión de estado registró la información de error en la base de datos. Debe haber un registro en la tabla aspnet_WebEvent_Events (consulte la figura 1); este registro contiene información sobre el error en tiempo de ejecución que acaba de producirse.

Screenshot that shows the error details that are logged to the table.

Figura 1: Los detalles del error se registraron en la tabla aspnet_WebEvent_Events
(Haga clic para ver la imagen a tamaño completo)

Mostrar el registro de errores en una página web

Con la configuración actual del sitio web, el sistema de supervisión de estado registra todas las excepciones no controladas en la base de datos. Sin embargo, la supervisión del estado no proporciona ningún mecanismo para ver el registro de errores a través de una página web. Sin embargo, puede crear una página de ASP.NET que muestre esta información de la base de datos (como veremos en seguida, puede optar por que se le envíen los detalles del error en un mensaje de correo electrónico).

Si crea este tipo de página, asegúrese de seguir los pasos necesarios para permitir que solo los usuarios autorizados vean los detalles del error. Si el sitio ya emplea cuentas de usuario, puede usar reglas de autorización de direcciones URL para restringir el acceso a la página a determinados usuarios o roles. Para obtener más información sobre cómo conceder o restringir el acceso a las páginas web en función del usuario que ha iniciado sesión, consulte mis tutoriales de seguridad del sitio web.

Nota:

En el tutorial siguiente se explora un sistema de notificaciones y registro de errores alternativo denominado ELMAH. ELMAH incluye un mecanismo integrado para ver el registro de errores desde una página web y como fuente RSS.

Registrar eventos en un correo electrónico

El sistema de supervisión de estado incluye un proveedor de origen de registro que "registra" un evento en un mensaje de correo electrónico. El origen del registro incluye la misma información que se registra en la base de datos en el cuerpo del mensaje de correo electrónico. Puede usar este origen de registro para notificar a un desarrollador cuando se produce un determinado evento de supervisión de estado.

Vamos a actualizar la configuración del sitio web Book Reviews para que recibamos un correo electrónico cada vez que se produzca una excepción. Para ello, es necesario realizar tres tareas:

  1. Configure la aplicación web ASP.NET para enviar correos electrónicos. Para ello, debe especificar cómo se envían los mensajes de correo electrónico a través del elemento de configuración <system.net>. Para obtener más información sobre el envío de mensajes de correo electrónico en una aplicación de ASP.NET, consulte Envío de correo electrónico en ASP.NET y Preguntas más frecuentes sobre System.Net.Mail.
  2. Registre el proveedor de origen del registro de correo electrónico en el elemento <providers>.
  3. Agregue una entrada al elemento <rules> que asigne el evento "Todos los errores" al proveedor de origen de registro agregado en el paso (2).

El sistema de supervisión de estado incluye dos clases de proveedor de origen de registro de correo electrónico: SimpleMailWebEventProvider y TemplatedMailWebEventProvider. La clase SimpleMailWebEventProvider envía un mensaje de correo electrónico de texto sin formato que incluye los detalles del evento y proporciona poca personalización del cuerpo del correo electrónico. Con la clase TemplatedMailWebEventProvider se especifica una página de ASP.NET cuyo marcado representado se usa como cuerpo del mensaje de correo electrónico. La clase TemplatedMailWebEventProvider proporciona un control mucho mayor sobre el contenido y el formato del mensaje de correo electrónico, pero requiere un poco más de trabajo inicial, ya que tiene que crear la página de ASP.NET que genera el cuerpo del mensaje de correo electrónico. Este tutorial se centra en el uso de la clase SimpleMailWebEventProvider.

Actualice el elemento <providers> del sistema de supervisión de estado del archivo Web.config para incluir un origen de registro para la clase SimpleMailWebEventProvider:

<providers>
  <clear />

  <add type="System.Web.Management.SimpleMailWebEventProvider"
  name="EmailWebEventProvider" buffer="false"
  from="support@example.com" to="support@example.com"
  subjectPrefix="Book Reviews Runtime Error: " />
  
  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
</providers>

El marcado anterior usa la clase SimpleMailWebEventProvider como proveedor de origen de registro y le asigna el nombre descriptivo "EmailWebEventProvider". Además, el atributo <add> incluye opciones de configuración adicionales, como las direcciones "A" y "De" del mensaje de correo electrónico.

Con el origen de registro de correo electrónico definido, lo único que queda es indicar al sistema de supervisión de estado que use este origen para "registrar" excepciones no controladas. Para ello, debe agregar una nueva regla en la sección <rules>:

<rules>
  <clear />

  <add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />

  <add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>

La sección <rules> ahora incluye dos reglas. La primera, denominada "Todos los errores al correo electrónico", envía todas las excepciones no controladas al origen de registro "EmailWebEventProvider". Esta regla tiene el efecto de enviar detalles sobre los errores en el sitio web a la dirección "A" especificada. La regla "Todos los errores a la base de datos" registra los detalles del error en la base de datos del sitio. Por lo tanto, siempre que se produzca una excepción no controlada en el sitio, sus detalles se registran en la base de datos y se envían a la dirección de correo electrónico especificada.

En la figura 2 se muestra el correo electrónico generado por la clase SimpleMailWebEventProvider al visitar Genre.aspx?ID=foo.

Screenshot that shows the error details sent in the email message.

Figura 2: Los detalles del error se envían en un mensaje de correo electrónico
(Haga clic para ver la imagen a tamaño completo)

Resumen

El sistema de supervisión de estado de ASP.NET está diseñado para permitir a los administradores supervisar el estado de una aplicación web implementada. Los eventos de supervisión de estado se generan cuando se desarrollan determinadas acciones, como cuando la aplicación se detiene, cuando un usuario inicia sesión correctamente en el sitio o cuando se produce una excepción no controlada. Estos eventos se pueden registrar en cualquier número de orígenes de registro. En este tutorial se muestra cómo registrar los detalles de las excepciones no controladas en una base de datos y a través de un mensaje de correo electrónico.

Este tutorial se centra en el uso de la supervisión de estado para registrar excepciones no controladas, pero tenga en cuenta que la supervisión de estado está diseñada para medir el estado general de una aplicación de ASP.NET implementada e incluye una gran cantidad de eventos de supervisión de estado y orígenes de registro que no se exploran aquí. Además, puede crear sus propios eventos de supervisión de estado y orígenes de registro, si surge la necesidad. Si le interesa obtener más información sobre la supervisión de estado, un buen primer paso es leer las preguntas más frecuentes sobre la supervisión de estado de Erik Reitan. A continuación, consulte Cómo: Usar la supervisión de estado en ASP.NET 2.0.

¡Feliz programación!

Lecturas adicionales

Para obtener más información sobre los temas tratados en este tutorial, consulte los siguientes recursos: