2010-05-18 3 views
22

Je tente de configurer ELMAH pour filtrer les erreurs 404 et je rencontre des difficultés avec les règles de filtrage fournies par XML dans mon fichier Web.config. J'ai suivi le tutoriel here et here et ajouté une déclaration <is-type binding="BaseException" type="System.IO.FileNotFoundException" /> sous ma déclaration <test><or>..., mais cela a complètement échoué.ELMAH - Filtrage des erreurs 404

Lorsqu'en void ErrorLog_Filtering() {} du Global.asax je l'ai testé je coincé sur place un point d'arrêt et a constaté que la System.Web.HttpException qui obtient tiré par ASP.NET pour un 404 ne semble pas avoir un type de base System.IO.FileNotFound, mais plutôt est simplement un System.Web.HttpException. J'ai testé cela en appelant e.Exception.GetBaseException().GetType() dans le gestionnaire d'événements.

Ensuite, j'ai décidé d'essayer un <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" /> dans l'espoir que tout message d'exception correspondant au motif "Le fichier '/foo.ext' n'existe pas" serait filtré, mais cela aussi n'a aucun effet. En dernier recours, j'ai essayé <is-type binding="BaseException" type="System.Exception" />, et même cela est entièrement ignoré.

Je suis enclin à penser qu'il y a une erreur de configuration avec ELMAH, mais je ne vois rien. Suis-je en train de manquer quelque chose d'évident?

Voici les choses pertinentes de mon 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 2ème lien jette un 404. Oh le ... Ironie – Baldy

+0

@Baldy Malheureusement, c'est un nouveau développement. Vous pouvez vous référer à mon échantillon de configuration pour ce dont vous avez besoin. –

+1

c'est bien Nathan, le sujet était utile. Je viens de trouver amusant que le sujet est à propos de 404, et l'un des liens sur la page mène à un 404 :) – Baldy

Répondre

38

Il était en effet une erreur de configuration, mais pas celle qui a été particulièrement évidente.

L'ordre dans lequel les modules HttpModules ELMAH sont enregistrés est une préoccupation pertinente car, pour qu'ELMAH filtre l'exception, il doit d'abord savoir quels modules vont consommer l'exception. Le fichier ErrorFilter HttpModule doit être enregistré en dernier pour empêcher les autres modules de traiter l'exception filtrée. Cela semble [en quelque sorte] en arrière pour moi, mais au moins cela fonctionne.

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

Après avoir examiné le nouveau ELMAH Wiki entry on ErrorFiltering j'ai découvert cette petite friandise de l'information qui mérite vraiment une < forte étiquette/>, si vous me demandez . (Modifier: Ils ont depuis que je en caractères gras d'abord répondu à cette question, les accessoires!)

La première étape consiste à configurer un module supplémentaire appelé Elmah.ErrorFilterModule. Assurez-vous d'ajouter après l'un des modules d'exploitation de ELMAH, comme le montre ici avec ErrorLogModule:

Questions connexes