Tratando erros com Elmah no ASP.NET MVC (parte 4 – Filtros)

Nesta 4ª parte do tema ELMAH, vamos ver o recurso de filtros (ErrorFiltering), ou seja, como podemos evitar que determinados tipos de erros não sejam logados pelo ELMAH.

Para isso, vamos usar como exemplo os conhecidos erros 404 (File Not Found). Se vocês começaram a brincar com o ELMAH, criando uma WebApp do zero e colocando o ELMAH para funcionar, devem ter notado que ele registra o erro 404 para o arquivo “favicon.ico” (obviamente se você não tiver adicionado este ícone na app 🙂 ).

Da mesma forma, para qualquer outro arquivo inexistente referenciado em nossas páginas, tais como .css, .js e imagens, o ELMAH registrará o erro 404, além, é claro, de endereços incorretos na URL.

Para evitar o log de erros 404, vamos usar um filtro, que é uma forma de dizer para o ELMAH ignorar determinado tipo de erro.

Podemos fazer isso tanto declarativamente via web.config como programaticamente.

Veremos como fazer das duas formas.

FILTRANDO ERROS DECLARATIVAMENTE

Em primeiro lugar, devemos nos certificar que o módulo responsável por filtrar erros (ErrorFilterModule) está devidamente registrado no web.config:

<httpModules>
    ....
    <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    ....
</httpModules>

E também aqui:

<system.webServer>
    ....
    <modules runAllManagedModulesForAllRequests="true">
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    ....
</system.webServer>

Certifique-se que o ErrorFilterModule está registrado APÓS todos os demais módulos.

Em segundo lugar, a seção “errorFilter” deve estar configurada no web.config:

<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>

Com o módulo e a seção configurados no web.config, agora é só declarar o filtro. (Obs.: se você instalou o ELMAH via NuGet todas as configurações acima já virão prontas.)

Acrescente a seção “errorFilter” dentro da seção “elmah”, como abaixo:

<elmah>
    ....
    <errorFilter>
    <test>
        <equal binding="HttpStatusCode" value="404" type="Int32" />
    </test>
    </errorFilter>
    ....
</elmah>

Observem que dentro da seção <test>, declaramos uma “assertion” do tipo “equal”, informando que, quando o HttpStatusCode for 404, o erro deverá ser ignorado. (O ELMAH ainda possui vários tipos de assertion, como “not”, “not-equal”, “greater”, etc.)

Prontinho. Basta rodar a aplicação, acessar alguns endereços inválidos, e depois verificar em [seusite]/elmah.axd que nenhum erro de código 404 está sendo logado. Simples!

FILTRANDO ERROS PROGRAMATICAMENTE

Agora faremos o mesmo via código.

Primeiro, remova a seção <errorFilter> da seção <elmah>.

Agora basta implementar o event handler ErrorLog_Filtering no global.asax:

using System.Web;
using Elmah;
....
protected void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (!(e.Exception.GetBaseException() is HttpException)) return;

    var ex = (HttpException)e.Exception.GetBaseException();

    if (ex.GetHttpCode() == 404)
        e.Dismiss(); // ignora o erro
}

Só isso! Erros 404 ignorados!!

Vale lembrar que filtros apenas ignoram registros dos erros no log e não tratam exceções. Isso quer dizer que um filtro evitará o log do erro mas a exceção continuará existindo, podendo “explodir” em sua aplicação (tela amarela da morte) se não estiver sendo tratada (via HandleErrorAtribute ou de qualquer outra forma).

Conclusão

Nesta pequena série sobre o ELMAH, vimos como é bem simples colocá-lo para funcionar, fazê-lo co-existir com o HandleErrorAtribute, barrar acessos não-autenticados ao endereço do log e também evitar o log de erros indesejados, usando filtros.

O ELMAH ainda possui várias funcionalidades, como enviar os erros por e-mail, usando o ErrorMailModule, e aplicar filtros mais complexos, usando expressões regulares. Podemos inclusive aplicar filtros no envio de e-mails, implementando o handler “ErrorMail_Filtering”, da forma que fizemos acima com o “ErrorLog_Filtering”.

Para quem gostou, acredito que estes 4 artigos dão uma boa base para começar a usá-lo imediatamente.

Para mais contéudo, podem consultar o wiki oficial: http://code.google.com/p/elmah/w/list
__________________________
Este artigo faz parte da série:
1) Tratando erros com Elmah no ASP.NET MVC (parte 1 – Configuração)
2) Tratando erros com Elmah no ASP.NET MVC (parte 2 – HandleError)
3) Tratando erros com Elmah no ASP.NET MVC (parte 3 – Segurança)
4) Tratando erros com Elmah no ASP.NET MVC (parte 4 – Filtros)

5 comentários em “Tratando erros com Elmah no ASP.NET MVC (parte 4 – Filtros)

Adicione o seu

  1. Olá Robson,

    Meu nome é Rafael Silva e sou editor geral das revistas .Net Magazine e easy Net Magazine.

    Tens interesse de escrever artigos para as mesmas?

    Abs !!!!

    Curtir

Participe! Vamos trocar uma ideia sobre desenvolvimento de software!

Blog no WordPress.com.

Acima ↑