当我在本地测试时,我在Global.asax的void ErrorLog_Filtering(){}中粘贴了一个断点,发现ASP.NET为404触发的System.Web.HttpException似乎没有基本类型System.IO.FileNotFound,而是它只是一个System.Web.HttpException。我通过在事件处理程序中调用e.Exception.GetBaseException()。GetType()来测试这个。
接下来我决定尝试一个< regex binding =“BaseException.Message”pattern =“该文件'/ [^']'不存在”/>希望任何匹配模式“/foo.ext”不存在的异常消息将被过滤,但也没有任何效果。作为最后的手段,我尝试< is-type binding =“BaseException”type =“System.Exception”/>,甚至完全被忽略。
我倾向于认为ELMAH存在配置错误,但我看不到任何内容。我错过了一些明显的事吗?
这是我的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" /> </modules> </system.webServer> </configuration>
解决方法
注册ELMAH HttpModules的顺序是一个相关的问题,因为为了使ELMAH过滤异常,它必须首先知道哪些模块将消耗异常。必须最后注册ErrorFilter HttpModule,以防止其他模块处理正在过滤的异常。这似乎是倒退了,但至少它是有效的。
<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>
再次检查了ELMAH Wiki entry on ErrorFiltering之后,我发现了这个小小的信息真的值得一个< strong />标签,如果你问我。 (编辑:自从我第一次回答这个问题以来,他们已经大胆了!道具!)
The first step is to configure an additional module called Elmah.ErrorFilterModule. Make sure you add it after any of the logging modules from ELMAH,as shown here with ErrorLogModule: