Как записать все ошибки в БД, но ошибки электронной почты только на условной основе? - PullRequest
9 голосов
/ 28 февраля 2012

Я хочу, чтобы электронная почта отправлялась только при определенных условиях и во всех случаях регистрировалась ошибка в БД.Но, как я понимаю, фильтрация не может работать для одного из двух.Это правильно?Если да, то как мне этого добиться?

Также стоит отметить, что прямо сейчас я сохраняю дополнительную информацию в базе данных на ErrorMail_Mailing в global.asax, как ответил Атиф Азиз .Поскольку электронная почта будет отправляться только на условной основе и ErrorMail_Mailing срабатывает только при отправке электронной почты, мне интересно, как я могу сохранить дополнительную информацию обо всех ошибках в базу данных.

ОБНОВЛЕНИЕ: Я немного изменил код Elmah, чтобы удовлетворить свои потребности.

Ответы [ 4 ]

2 голосов
/ 01 ноября 2012

Первым шагом является настройка модулей.Убедитесь, что вы добавили Elmah.ErrorFilterModule после любого из модулей журналирования из ELMAH, как показано здесь с ErrorLogModule:

<httpModules>
    ...     
    //email
    <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
    //sql
    <add name="ErrorSql" type="Elmah.SqlErrorLog, Elmah"/>
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>

    ...
</httpModules>

Затем в разделе конфигурации зарегистрирован Elmah.ErrorFilterSectionHandler, как показано здесь:

<configSections>
    <configSections>
      <sectionGroup name="elmah">
          <section name="errorFilter" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
      </sectionGroup>
  </configSections>

Теперь вы можете добавить фильтры, чтобы решить, какие ошибки игнорировать и для какого источника.В следующем примере показано, как предотвратить отправку 404 ошибок HTTP.

<elmah>
    <errorMail from="xx@xx.com" fromName="xx" to="xx@xx.com" subject="An unhandled exception occured xxx" priority="Normal" async="false" smtpServer="xx.xx.xx.com"/>
    //sql
    <errorLog name="ErrorSql" type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyConnectionString" />
    <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
    <errorFilter>
        <test>
            <and>
                <equal binding="HttpStatusCode" value="404" type="Int32" />
                <regex binding="FilterSourceType.Name" pattern="mail" />
            </and>
        </test>
    </errorFilter>
</elmah>  

Более подробную информацию можно найти по следующей ссылке.

http://code.google.com/p/elmah/wiki/ErrorFiltering

1 голос
/ 08 мая 2014

Документация ELMAH по фильтрации ошибок имеет секцию точно по вашему сценарию и вызывается, что составляет фильтрацию по источнику . Например, следующее предотвратит отправку 404 HTTP-ошибок по почте, но они все равно будут регистрироваться (при условии, что оба почтовых модуля и модуль регистрации зарегистрированы):

<errorFilter>
    <test>
        <and>
            <equal binding="HttpStatusCode" value="404" type="Int32" />
            <regex binding="FilterSourceType.Name" pattern="mail" />
        </and>
    </test>
</errorFilter>
0 голосов
/ 09 ноября 2012

Вы должны попробовать StackExchange.Exceptional

Этот проект был вдохновлен ELMAH, но он не отвечал нашим особым потребностям для очень, очень большого объема регистрации ошибоккогда происходит событие сетевого уровня.

StackExchange.Exceptional - это обработчик ошибок, используемый внутренне Stack Exchange и Stack Overflow для входа в SQL.

Он также поддерживает JSON и хранилища ошибок памяти, фильтруяисключений перед ведением журнала и механизмов сбоя / повторения для хранения ошибок, если при подключении к хранилищу ошибок происходит прерывание.

Это очень настраиваемый инструмент, и его действительно легко добавить в соответствии с вашими потребностями.Как я вижу, в выдвижном запросе реализована функция электронной почты Функция электронной почты , поэтому вы можете начать с нее.

Чтобы настроить ее, вам нужно только взглянуть на web.config и выберите, что включить.

Надеюсь, это поможет.

0 голосов
/ 03 марта 2012

Если вы хотите сохранить все исключения в базе данных, вы просто должны иметь возможность использовать ErrorLogModule примерно так, который должен быть независимым от того, что вы делаете в почтовом модуле ошибки:

<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />

и затем в разделе elmah вашей конфигурации:

<errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyConnectionString" />
...