Elmah - фильтрация 404 ошибок
Вопрос
Я пытаюсь настроить Elmah для фильтрации 404 ошибок, и я работаю в трудностях с помощью правил фильтра XML в моем файле Web.config. Я следовал за руководством здесь и здесь и добавил А.Н. <is-type binding="BaseException" type="System.IO.FileNotFoundException" />
Декларация под моим <test><or>...
Декларация, но это совершенно не удалось.
Когда я проверил это локально, я заставил точку останова в void ErrorLog_Filtering() {}
глобального .Asax и обнаружил, что System.Web.HttpException
который уволен ASP.NET для 404, похоже, не имеет базового типа System.IO.FileNotFound
, а скорее это просто System.Web.HttpException
. Отказ Я проверил это, позвонив e.Exception.GetBaseException().GetType()
в обработчике событий.
Далее я решил попробовать <regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
В надежде, что любые исключительные сообщения, соответствующие шаблону «Файл '/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"/>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
</modules>
</system.webServer>
</configuration>
Решение
Это была действительно ошибка конфигурации, просто не тот, который был особенно очевиден.
Порядок, в котором зарегистрирован elmah httpModules, является уместной проблемой, поскольку для того, чтобы Elmah отфильтровать исключение, он должен сначала знать, какие модули будут потребляющими исключение. HTPMODULE ERRORFILTER DIPPMODULE должен быть зарегистрирован в прошлом Для предотвращения обработки других модулей отфильтровывают исключение. Это кажется [вид] назад ко мне, но, по крайней мере, он работает.
<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 запись на ErrorFiltering снова я обнаружил этот маленький тидбит информации который действительно заслуживает u003Cstrong /> тег, если вы спросите меня. (Редактировать: Они смело жирные, так как я впервые ответил на этот вопрос; реквизит!)
Первый шаг - настроить дополнительный модуль под названием Elmah.errorfiltermodule. Убедитесь, что вы добавляете его после любого из модулей ведения журнала из Elmah, как показано здесь с ErrorLogModule: