Вопрос

Я пытаюсь настроить 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:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top