如何记录数据库中的所有错误但仅在条件基础上发送电子邮件错误?

时间:2012-02-28 07:35:45

标签: c# asp.net elmah error-logging

我希望电子邮件仅在特定条件下发送,并且在所有情况下都会在DB中记录错误。但据我了解,过滤不适用于其中之一。是对的吗?如果是的话,我该如何实现呢?

另请注意,现在I'm saving additional info to database ErrorMail_Mailing位于global.asaxAtif Aziz回复了{{3}}。因为电子邮件只会在有条件的基础上发送,ErrorMail_Mailing仅在发送电子邮件时才会触发,我想知道如何将所有错误的其他信息保存到数据库中。

更新:我已经修改了Elmah代码以满足我的需要。

4 个答案:

答案 0 :(得分:2)

第一步是配置模块。确保在ELMAH的任何日志记录模块之后添加Elmah.ErrorFilterModule,如此处所示,带有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 :(得分:1)

error filtering上的ELMAH文档在您的方案中有一个section并被调用,相当于filtering by source。例如,以下内容将阻止404 HTTP错误被邮寄,但它们仍将被记录(假设邮件和日志记录模块都已注册):

<errorFilter>
    <test>
        <and>
            <equal binding="HttpStatusCode" value="404" type="Int32" />
            <regex binding="FilterSourceType.Name" pattern="mail" />
        </and>
    </test>
</errorFilter>

答案 2 :(得分:0)

如果要保存数据库的所有异常,您应该只能使用ErrorLogModule,这应该与您在错误邮件模块中执行的操作无关:

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

然后在你的配置的elmah版本中:

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

答案 3 :(得分:0)

您应该试用StackExchange.Exceptional

  

这个项目的灵感来自ELMAH,但它并不适合我们的特殊情况   在网络级别需要非常非常高的容量错误记录   事件发生。

     

StackExchange.Exceptional是内部使用的错误处理程序   用于记录到SQL的堆栈交换和堆栈溢出。

     

它还支持JSON和内存错误存储,过滤异常   在记录之前,以及用于存储错误的失败/重试机制   连接到错误存储区时出现中断。

它是高度可定制的,并且根据您的需要添加内容非常容易。 我可以看到拉取请求已实现电子邮件功能Email functionality,因此您可以从那里开始。

要设置它,您只需要查看web.config 并选择要启用的内容。

希望它有所帮助。

相关问题