Pergunta

Estou tentando configurar o Elmah para filtrar os erros 404 e estou enfrentando dificuldades com as regras de filtro fornecidas por XML no meu arquivo web.config. Eu segui o tutorial aqui e aqui e adicionou um <is-type binding="BaseException" type="System.IO.FileNotFoundException" /> Declaração sob meu <test><or>... Declaração, mas isso falhou completamente.

Quando o testei localmente, coloquei um ponto de interrupção em void ErrorLog_Filtering() {} do global.asax e descobriu que o System.Web.HttpException Isso é demitido pelo ASP.NET para um 404 não parece ter um tipo base de System.IO.FileNotFound, mas sim é simplesmente um System.Web.HttpException. Eu testei isso ligando e.Exception.GetBaseException().GetType() no manipulador de eventos.

Em seguida, decidi tentar um <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> Na esperança de que qualquer mensagem de exceção que corresponda ao padrão "o arquivo '/foo.ext' não existe" seria filtrada, mas isso também não está tendo efeito. Como último recurso, tentei <is-type binding="BaseException" type="System.Exception" />, e mesmo isso é totalmente desconsiderado.

Estou inclinado a pensar que há um erro de configuração com o Elmah, mas não consigo ver nenhum. Estou perdendo algo flagrantemente óbvio?

Aqui estão as coisas relevantes do meu web.config:

<configuration>
  <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>
  <elmah>
    <errorFilter>
      <test>
        <or>
          <equal binding="HttpStatusCode" value="404" type="Int32" />
          <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
        </or>
      </test>
    </errorFilter>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/logs/elmah" />
  </elmah>
  <system.web>
    <httpModules>
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
    </httpModules>
  </system.web>
  <system.webServer>
    <modules>
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
    </modules>
  </system.webServer>
</configuration>
Foi útil?

Solução

Foi realmente um erro de configuração, mas não era particularmente óbvio.

A ordem em que os httpmodules Elmah são registrados é uma preocupação pertinente, porque para que Elmah filtre a exceção, ele deve primeiro saber quais módulos consumirão a exceção. O ErrorFilter httpmodule deve ser registrado pela última vez Para impedir que os outros módulos processem a exceção sendo filtrada. Isso parece [meio] para trás, mas pelo menos funciona.

<configuration>
  ...
  <system.web>
    <httpModules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
    </httpModules>
  </system.web>
  <system.webServer>
    <modules>
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
    </modules>
  </system.webServer>
</configuration>

Depois de revisar o Entrada do Wiki Elmah no Errorfiltering Mais uma vez eu descobri esse pequeno boato de informação que realmente merece um u003Cstrong /> Tag, se você me perguntar. (Editar: Eles o disputaram desde que respondi a essa pergunta; adereços!)

O primeiro passo é configurar um módulo adicional chamado Elmah.errorFiltermodule. Certifique -se de adicioná -lo após qualquer um dos módulos de registro da Elmah, como mostrado aqui com ErrorLogModule:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top