【问题标题】:How to log all error in DB but email errors only on conditional basis?如何在数据库中记录所有错误,但仅在有条件的情况下记录电子邮件错误?
【发布时间】:2012-03-17 16:41:49
【问题描述】:

我希望仅在特定条件下发送电子邮件,并在所有情况下都在数据库中记录错误。但据我了解,过滤不适用于两者之一。那正确吗?如果是这样,我该如何实现呢?

还需要注意的是,现在 I'm saving additional info to database 上的 ErrorMail_Mailingglobal.asax 上,由 Atif Aziz 回复。因为电子邮件将仅在有条件的基础上发送,ErrorMail_Mailing 仅在发送电子邮件时触发,我想知道如何将所有错误的附加信息保存到数据库中。

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

【问题讨论】:

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


    【解决方案1】:

    第一步是配置模块。确保在 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

    【讨论】:

      【解决方案2】:

      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>
      

      【讨论】:

        【解决方案3】:

        如果您想将所有异常保存到数据库中,您应该能够像这样使用 ErrorLogModule,它应该独立于您在错误邮件模块中所做的事情:

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

        然后在配置的 elmah 部分中:

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

        【讨论】:

        • 那么电子邮件呢?现在我已经获取了 ELMAH 的源代码并为我的目的对其进行了修改。但这需要时间。
        【解决方案4】:

        你应该试试StackExchange.Exceptional

        这个项目的灵感来自 ELMAH,但它并不适合我们的特定需求 网络级别时需要非常非常大量的错误日志记录 事件发生。

        StackExchange.Exceptional 是内部使用的错误处理程序 用于记录到 SQL 的 Stack Exchange 和 Stack Overflow。

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

        它是高度可定制的,根据您的需要添加一些东西真的很容易。 如我所见,拉取请求已实现电子邮件功能Email functionality,因此您可以从那里开始。

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

        希望对你有帮助。

        【讨论】:

        • 非常感谢您的详细回答。我稍微修改了 Elmah 代码以满足我的需要。
        猜你喜欢
        • 2011-10-19
        • 1970-01-01
        • 2016-12-17
        • 2021-12-22
        • 1970-01-01
        • 2018-08-23
        • 2011-11-25
        • 2014-05-20
        • 2017-12-23
        相关资源
        最近更新 更多