2010-05-18 8 views
22

Estoy intentando configurar ELMAH para filtrar los errores 404 y me encuentro con dificultades con las reglas de filtrado proporcionadas por XML en mi archivo Web.config. Seguí el tutorial here y here y agregué una declaración <is-type binding="BaseException" type="System.IO.FileNotFoundException" /> bajo mi declaración <test><or>..., pero eso falló completamente.ELMAH - Errores de filtrado 404

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 se es simplemente un System.Web.HttpException. Probé esto llamando al e.Exception.GetBaseException().GetType() en el controlador de eventos.

A continuación, decidí probar <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> con la esperanza de que cualquier mensaje de excepción que coincida con el patrón "El archivo '/foo.ext' no existe" se filtre, pero eso tampoco tiene efecto. Como último recurso, probé <is-type binding="BaseException" type="System.Exception" />, e incluso eso se descarta por completo.

Me inclino a pensar que hay un error de configuración con ELMAH, pero no puedo ver ninguno. ¿Me estoy perdiendo algo descaradamente obvio?

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

que segundo enlace lanza una 404. Oh, la ironía ... – Baldy

+0

@Baldy Por desgracia, esto es un nuevo desarrollo. Puede consultar mi ejemplo de configuración para obtener lo que necesita. –

+1

está bien Nathan, el tema fue útil. Me pareció gracioso que el tema sea sobre 404, y uno de los enlaces en la página lleva a un 404 :) – Baldy

Respuesta

38

se trataba efectivamente de un error de configuración, pero no una que fue particularmente evidente.

El orden en que se registran los HttpModules de ELMAH es una preocupación pertinente porque para que ELMAH filtre la excepción, primero debe saber qué módulos consumirán la excepción. ErrorFilter HttpModule se debe registrar pasado para evitar que los otros módulos procesen la excepción que se filtra. Esto me parece [tipo de] retroceso, 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 el nuevo ELMAH Wiki entry on ErrorFiltering descubrí esta golosina poco de información lo que realmente merece una fuerte etiqueta </>, si me preguntas . (Editar: Han en negrita que desde que respondieron a esta pregunta; accesorios!)

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

Cuestiones relacionadas