Pregunta

Estoy intentando configurar ELMAH para filtrar los errores 404 y estoy corriendo en dificultades con las reglas de filtrado XML proporcionado en mi archivo Web.config. He seguido el tutorial aquí y aquí y ha añadido una declaración <is-type binding="BaseException" type="System.IO.FileNotFoundException" /> bajo mi declaración <test><or>..., pero que fracasó por completo.

Cuando lo probé me quedé localmente un punto de interrupción en void ErrorLog_Filtering() {} del Global.asax y encontré que el System.Web.HttpException que es despedido por ASP.NET para un 404 no parecen tener un tipo base de System.IO.FileNotFound, sino que es simplemente una System.Web.HttpException. Probé esto llamando e.Exception.GetBaseException().GetType() en el controlador de eventos.

A continuación, decidí probar un <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> con la esperanza de que cualquier mensaje de excepción coincida con el patrón "El archivo '/foo.ext' no existe" conseguiría filtrados, pero eso también está teniendo ningún efecto. Como último recurso Probé <is-type binding="BaseException" type="System.Exception" />, e incluso que se tiene en cuenta en su totalidad.

Me inclino a pensar que hay un error de configuración con ELMAH, pero no veo ninguna. Me estoy perdiendo algo salta a la vista?

Aquí está la materia relevante de mi 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>
¿Fue útil?

Solución

Era de hecho un error de configuración, pero no una que era particularmente evidente.

El orden en el que están registrados los HttpModules ELMAH es una preocupación pertinente porque para que ELMAH para filtrar la excepción primero tiene que saber qué módulos estarán consumiendo la excepción. El ErrorFilter HttpModule deben estar registrados última para evitar que los otros módulos de procesamiento de la excepción que se filtra. Esto parece [tipo de] hacia atrás para mí, pero al 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>

Después de revisar la entrada ELMAH Wiki en ErrorFiltering de nuevo me descubrió este golosina poco de información lo que realmente se merece un etiqueta, si me preguntas . ( Editar : Han negrita que desde que respondieron a esta pregunta; puntales)

  

El primer paso consiste en configurar un módulo adicional llamado Elmah.ErrorFilterModule. Asegúrese de que añade que después de cualquiera de los módulos de registro de ELMAH, como se muestra aquí con ErrorLogModule:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top