Registro em log de detalhes de erros com o monitoramento de integridade do ASP.NET (C#)
por Scott Mitchell
O sistema de monitoramento de integridade da Microsoft fornece uma maneira fácil e personalizável de registrar vários eventos da Web, incluindo exceções sem tratamento. Este tutorial explica como configurar o sistema de monitoramento de integridade para registrar exceções sem tratamento em um banco de dados e notificar os desenvolvedores por meio de uma mensagem de email.
Introdução
O registro em log é uma ferramenta útil para monitorar a integridade de um aplicativo implantado e para diagnosticar quaisquer problemas que possam surgir. É especialmente importante registrar erros que ocorrem em um aplicativo implantado para que eles possam ser corrigidos. O Error
evento é gerado sempre que ocorre uma exceção sem tratamento em um aplicativo ASP.NET; o tutorial anterior mostrou como notificar um desenvolvedor sobre um erro e registrar seus detalhes criando um manipulador de eventos para o Error
evento. No entanto, a criação de um Error
manipulador de eventos para registrar os detalhes do erro e notificar um desenvolvedor é desnecessária, pois essa tarefa pode ser executada pelo ASP. NET.
O sistema de monitoramento de integridade foi introduzido no ASP.NET 2.0 e foi projetado para monitorar a integridade de um aplicativo ASP.NET implantado registrando eventos que ocorrem durante o tempo de vida do aplicativo ou da solicitação. Os eventos registrados pelo sistema de monitoramento de integridade são chamados de eventos de monitoramento de integridade ou eventos da Web e incluem:
- Eventos de tempo de vida do aplicativo, como quando um aplicativo é iniciado ou interrompido
- Eventos de segurança, incluindo tentativas de login com falha e solicitações de autorização de URL com falha
- Erros de aplicativo, incluindo exceções sem tratamento, exceções de análise de estado de exibição, exceções de validação de solicitação e erros de compilação, entre outros tipos de erros.
Quando um evento de monitoramento de integridade é gerado, ele pode ser registrado em qualquer número de fontes de log especificadas. O sistema de monitoramento de integridade é fornecido com fontes de log que registram eventos da Web em um banco de dados do Microsoft SQL Server, no Log de Eventos do Windows ou por meio de uma mensagem de email, entre outros. Você também pode criar suas próprias fontes de log.
Os eventos que o sistema de monitoramento de integridade registra, juntamente com as fontes de log usadas, são definidos no Web.config
. Com algumas linhas de marcação de configuração, você pode usar o monitoramento de integridade para registrar todas as exceções sem tratamento em um banco de dados e notificá-lo sobre a exceção por email.
Explorando a configuração do sistema de monitoramento de integridade
O comportamento do sistema de monitoramento de integridade é definido por suas informações de configuração, que estão localizadas no <healthMonitoring>
elemento em Web.config
. Esta seção de configuração define, entre outras coisas, as três informações importantes a seguir:
- Os eventos de monitoramento de integridade que, quando gerados, devem ser registrados,
- As fontes de log e
- Como cada evento de monitoramento de integridade definido em (1) é mapeado para as fontes de log definidas em (2).
Essas informações são especificadas por meio de três elementos de configuração filhos: <eventMappings>
, <providers>
, e <rules>
, respectivamente.
As informações de configuração do sistema de monitoramento de integridade padrão podem ser encontradas no Web.config
arquivo na %WINDIR%\Microsoft.NET\Framework\version\CONFIG
pasta. Essas informações de configuração padrão, com algumas marcações removidas para fins de brevidade, são mostradas abaixo:
<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>
Os eventos de monitoramento de integridade de interesse são definidos no <eventMappings>
elemento, que dá um nome amigável a uma classe de eventos de monitoramento de integridade. Na marcação acima, o <eventMappings>
elemento atribui o nome amigável "Todos os Erros" aos eventos de monitoramento de integridade do tipo WebBaseErrorEvent
e o nome "Auditorias de Falha" aos eventos de monitoramento de integridade do tipo WebFailureAuditEvent
.
O <providers>
elemento define as fontes de log, dando a elas um nome amigável e especificando qualquer informação de configuração específica da origem de log. O primeiro <add>
elemento define o provedor "EventLogProvider", que registra os eventos de monitoramento de integridade especificados usando a EventLogWebEventProvider
classe. A EventLogWebEventProvider
classe registra o evento no Log de Eventos do Windows. O segundo <add>
elemento define o provedor "SqlWebEventProvider", que registra eventos em um banco de dados do Microsoft SQL Server por meio da SqlWebEventProvider
classe. A configuração "SqlWebEventProvider" especifica a cadeia de conexão do banco de dados (connectionStringName
) entre outras opções de configuração.
O <rules>
elemento mapeia os <eventMappings>
eventos especificados no elemento para registrar fontes no <providers>
elemento. Por padrão, ASP.NET aplicativos Web registram todas as exceções sem tratamento e falhas de auditoria no Log de Eventos do Windows.
Registrando eventos em um banco de dados
A configuração padrão do sistema de monitoramento de integridade pode ser personalizada em uma base de aplicativo da Web por aplicativo da Web, adicionando uma <healthMonitoring>
seção ao arquivo do Web.config
aplicativo. Você pode incluir elementos adicionais nas <eventMappings>
seções , <providers>
e e <rules>
usando o <add>
elemento. Para remover uma configuração da configuração padrão, use o <remove>
elemento ou use <clear />
para remover todos os valores padrão de uma dessas seções. Vamos configurar o aplicativo Web Revisões de Livros para registrar todas as exceções sem tratamento em um banco de dados do Microsoft SQL Server usando a SqlWebEventProvider
classe.
A SqlWebEventProvider
classe faz parte do sistema de monitoramento de integridade e registra um evento de monitoramento de integridade em um banco de dados SQL Server especificado. A SqlWebEventProvider
classe espera que o banco de dados especificado inclua um procedimento armazenado chamado aspnet_WebEvent_LogEvent
. Esse procedimento armazenado recebe os detalhes do evento e tem a tarefa de armazenar os detalhes do evento. A boa notícia é que você não precisa criar esse procedimento armazenado nem a tabela para armazenar os detalhes do evento. Você pode adicionar esses objetos ao seu banco de dados usando a aspnet_regsql.exe
ferramenta.
Observação
A aspnet_regsql.exe
ferramenta foi discutida no tutorial Configurando um site que usa serviços de aplicativos quando adicionamos suporte para ASP. NET. Consequentemente, o banco de dados do site Book Reviews já contém o aspnet_WebEvent_LogEvent
procedimento armazenado, que armazena as informações do evento em uma tabela chamada aspnet_WebEvent_Events
.
Depois de adicionar o procedimento armazenado e a tabela necessários ao banco de dados, tudo o que resta é instruir o monitoramento de integridade a registrar todas as exceções sem tratamento no banco de dados. Faça isso adicionando a seguinte marcação ao arquivo do Web.config
seu site:
<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>
A marcação de configuração de monitoramento de integridade acima usa <clear />
elementos para apagar as informações de configuração de monitoramento de integridade predefinidas das <eventMappings>
seções , <providers>
e <rules>
. Em seguida, ele adiciona uma única entrada a cada uma dessas seções.
- O
<eventMappings>
elemento define um único evento de monitoramento de integridade de interesse chamado "Todos os Erros", que é gerado sempre que ocorre uma exceção sem tratamento. - O
<providers>
elemento define uma única fonte de log chamada "SqlWebEventProvider" que usa aSqlWebEventProvider
classe. OconnectionStringName
atributo foi definido como "ReviewsConnectionString", que é o nome da cadeia de conexão definida na<connectionStrings>
seção. - Por fim, o <elemento rules> indica que, quando um evento "Todos os Erros" ocorre, ele deve ser registrado usando o provedor "SqlWebEventProvider".
Essas informações de configuração instruem o sistema de monitoramento de integridade a registrar todas as exceções sem tratamento no banco de dados de Revisões de Livros.
Observação
O WebBaseErrorEvent
evento é gerado apenas para erros do servidor; ele não é gerado para erros HTTP, como uma solicitação para um recurso ASP.NET que não foi encontrado. Isso difere do comportamento do Error
evento da HttpApplication
classe, que é gerado para erros de servidor e HTTP.
Para ver o sistema de monitoramento de integridade em ação, visite o site e gere um erro de tempo de execução visitando Genre.aspx?ID=foo
. Você deve ver a página de erro apropriada - a Tela Amarela da Morte de Detalhes da Exceção (ao visitar localmente) ou a página de erro personalizada (ao visitar o site em produção). Nos bastidores, o sistema de monitoramento de integridade registrou as informações de erro no banco de dados. Deve haver um registro na tabela (consulte a aspnet_WebEvent_Events
Figura 1); esse registro contém informações sobre o erro de tempo de execução que acabou de ocorrer.
Figura 1: Os detalhes do erro foram registrados na aspnet_WebEvent_Events
tabela
(Clique para ver a imagem em tamanho real)
Exibindo o log de erros em uma página da Web
Com a configuração atual do site, o sistema de monitoramento de integridade registra todas as exceções sem tratamento no banco de dados. No entanto, o monitoramento de integridade não fornece nenhum mecanismo para exibir o log de erros por meio de uma página da Web. No entanto, você pode criar uma página ASP.NET que exiba essas informações do banco de dados. (Como veremos em breve, você pode optar por receber os detalhes do erro em uma mensagem de email.)
Se você criar uma página desse tipo, certifique-se de tomar medidas para permitir que apenas usuários autorizados exibam os detalhes do erro. Se seu site já emprega contas de usuário, você pode usar regras de autorização de URL para restringir o acesso à página a determinados usuários ou funções. Para obter mais informações sobre como conceder ou restringir o acesso a páginas da web com base no usuário conectado, consulte meus Tutoriais de segurança do site.
Observação
O tutorial subsequente explora um sistema alternativo de registro e notificação de erros chamado ELMAH. O ELMAH inclui um mecanismo interno para exibir o log de erros de uma página da Web e como um feed RSS.
Registrando eventos no e-mail
O sistema de monitoramento de integridade inclui um provedor de origem de log que "registra" um evento em uma mensagem de email. A fonte de log inclui as mesmas informações registradas no banco de dados no corpo da mensagem de email. Você pode usar essa fonte de log para notificar um desenvolvedor quando ocorrer um determinado evento de monitoramento de integridade.
Vamos atualizar a configuração do site Book Reviews para que recebamos um e-mail sempre que ocorrer uma exceção. Para conseguir isso, precisamos realizar três tarefas:
- Configure o aplicativo Web ASP.NET para enviar email. Isso é feito especificando como as mensagens de email são enviadas por meio do
<system.net>
elemento de configuração. Para obter mais informações sobre o envio de mensagens de e-mail em um aplicativo ASP.NET, consulte Enviando e-mail no ASP.NET e System.Net.Mail. - Registre o provedor de origem de log de e-mail no
<providers>
elemento e - Adicione uma entrada ao elemento que mapeia
<rules>
o evento "Todos os Erros" para o provedor de origem de log adicionado na etapa (2).
O sistema de monitoramento de integridade inclui duas classes de provedor de origem de log de email: SimpleMailWebEventProvider
e TemplatedMailWebEventProvider
. A SimpleMailWebEventProvider
classe envia uma mensagem de email de texto simples que inclui os detalhes do evento e fornece pouca personalização do corpo do email. Com a classe, TemplatedMailWebEventProvider
você especifica uma página ASP.NET cuja marcação renderizada é usada como o corpo da mensagem de email. A TemplatedMailWebEventProvider
aula oferece um controle muito maior sobre o conteúdo e o formato da mensagem de email, mas requer um pouco mais de trabalho inicial, pois você precisa criar a página ASP.NET que gera o corpo da mensagem de email. Este tutorial se concentra no uso da SimpleMailWebEventProvider
classe.
Atualize o elemento do sistema de monitoramento de <providers>
integridade no Web.config
arquivo para incluir uma fonte de log para a SimpleMailWebEventProvider
classe:
<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>
A marcação acima usa a SimpleMailWebEventProvider
classe como o provedor de origem de log e atribui a ela o nome amigável "EmailWebEventProvider". Além disso, o <add>
atributo inclui opções de configuração adicionais, como os endereços Para e De da mensagem de email.
Com a origem do log de email definida, tudo o que resta é instruir o sistema de monitoramento de integridade a usar essa fonte para "registrar" exceções sem tratamento. Isso é feito adicionando uma nova regra na <rules>
seção:
<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>
A <rules>
seção agora inclui duas regras. O primeiro, chamado "Todos os erros para email", envia todas as exceções sem tratamento para a fonte de log "EmailWebEventProvider". Essa regra tem o efeito de enviar detalhes sobre erros no site para o endereço Para especificado. A regra "Todos os erros no banco de dados" registra os detalhes do erro no banco de dados do site. Consequentemente, sempre que ocorre uma exceção não tratada no site, seus detalhes são registrados no banco de dados e enviados para o endereço de e-mail especificado.
A Figura 2 mostra o e-mail gerado pela turma SimpleMailWebEventProvider
ao visitar Genre.aspx?ID=foo
o .
Figura 2: Os detalhes do erro são enviados em uma mensagem de email
(Clique para ver a imagem em tamanho real)
Resumo
O sistema de monitoramento de integridade ASP.NET foi projetado para permitir que os administradores monitorem a integridade de um aplicativo Web implantado. Os eventos de monitoramento de integridade são gerados quando determinadas ações se desenrolam, como quando o aplicativo é interrompido, quando um usuário faz logon com êxito no site ou quando ocorre uma exceção sem tratamento. Esses eventos podem ser registrados em qualquer número de fontes de log. Este tutorial mostrou como registrar os detalhes de exceções sem tratamento em um banco de dados e por meio de uma mensagem de email.
Este tutorial se concentrou no uso do monitoramento de integridade para registrar exceções sem tratamento, mas lembre-se de que o monitoramento de integridade foi projetado para medir a integridade geral de um aplicativo ASP.NET implantado e inclui uma grande variedade de eventos de monitoramento de integridade e fontes de log não exploradas aqui. Além disso, você pode criar seus próprios eventos de monitoramento de integridade e fontes de log, caso seja necessário. Se você estiver interessado em aprender mais sobre monitoramento de saúde, um bom primeiro passo é ler as perguntas frequentes sobre monitoramento de saúde de Erik Reitan. Em seguida, consulte Como usar o monitoramento de integridade no ASP.NET 2.0.
Boa programação!
Leitura Adicional
Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:
- Visão geral do Monitoramento de Integridade do ASP.NET
- Configurando e personalizando o sistema de monitoramento de integridade do ASP.NET
- Perguntas frequentes - Monitoramento de integridade no ASP.NET 2.0
- Como enviar email para notificações de monitoramento de integridade
- Como usar o monitoramento de integridade no ASP.NET
- Monitoramento de integridade em ASP.NET