【问题标题】:elmah with mvc is logging twice带有 mvc 的 elmah 记录了两次
【发布时间】:2012-11-28 17:26:20
【问题描述】:

每次 Elmah 记录错误时,该错误都会记录两次。 100% 与完全相同的时间戳相同。 我在 web.config 中没有特殊配置。 我创建了一个 ElmahHandleErrorAttribute 并添加了两个过滤器:

filters.Add(new ElmahHandleErrorAttribute {

            ExceptionType = typeof(System.Data.Common.DbException),
            // DbError.cshtml is a view in the Shared folder.
            View = "DbError",
            Order = 2
        });

filters.Add(new ElmahHandleErrorAttribute {

            ExceptionType = typeof(Exception),
            // DbError.cshtml is a view in the Shared folder.
            View = "Error",
            Order = 3
        });

来自 web.config 的一些片段:

<httpModules>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </httpModules>

<modules runAllManagedModulesForAllRequests="true">
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>

在 ElmaHandleErrorAttribute 中这段代码:

public override void OnException(ExceptionContext context) {
        base.OnException(context);
        if (!context.ExceptionHandled       
            || TryRaiseErrorSignal(context) 
            || IsFiltered(context))         
            return;

        LogException(context);
    }

我搜索了很多,但没有适合我的问题的解决方案。 web.config 中没有重复条目或类似的内容。

问题不大,但很烦人。

提前谢谢

©a-x-i

【问题讨论】:

  • 您没有在自定义 ElmaHandleErrorAttribute 中检查 ExceptionType。所以它会被调用2次。因为 DbException 继承自 Exception。
  • 请参阅我对这个类似问题的建议答案stackoverflow.com/a/16794746/589827

标签: model-view-controller elmah


【解决方案1】:

我的设置也遇到了同样的问题,所以我创建了一个 ExceptionLogger 类。然后向它添加一个静态字段以保留它记录的异常列表。然后当 onException 事件发生时,它会检查记录的最后一个异常以避免记录重复。

public class ExceptionLogger
{
    public static List<Exception> loggedExceptions = new List<Exception>();

    public static void LogException(Exception e) {

...

    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        var e = context.Exception;

        if (!e.Equals(ExceptionLogger.loggedExceptions.Last()))
        {
            ExceptionLogger.LogException(e);
        }

     }

【讨论】:

  • 这一直有效,直到您在不同的请求上同时抛出两个异常。
猜你喜欢
  • 2023-03-30
  • 2016-12-04
  • 2014-05-07
  • 1970-01-01
  • 2017-03-07
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多