elmah:没有HttpContext的异常?

42

我在Application_Start中生成一个线程,并希望记录异常。没有Context/HttpContext/HttpContext.Current,那么我该如何记录日志呢?

目前,它不会捕获任何线程中的异常,如果我写ErrorSignal.FromCurrentContext().Raise(ex);,则会出现关于context不能为null的错误。

也许我可以创建一个虚拟的HttpContext,但不确定能否起作用。

-编辑- 我试过ErrorSignal.Get(new HttpApplication()).Raise(ex);,但似乎无法捕获到异常。

4个回答

73

请确保在 web.config 文件中设置了您的应用程序名称。

<errorLog type="Elmah.SqlErrorLog, Elmah" 
          connectionStringName="nibWeb" 
          applicationName="Nib.Services" />

然后

ErrorLog.GetDefault(null).Log(new Error(error));

能够正常工作


1
说句题外话,如果你正在使用 Elmah 的内存日志记录功能,你不需要进行配置更改,只需调用 ErrorLog.GetDefault(null).Log(new Error(error)) 即可。 - chris.house.00
4
警告:这种方法似乎不会引发真正的Elmah错误事件——例如,您不会收到错误电子邮件(如果已经配置)。要做到这一点,您需要调用 .Raise()。不幸的是,您需要一个 HttpContext 才能调用 .Raise(),所以我知道在这些情况下能做到的唯一方法是存储 HttpContext 并稍后使用它。 - JoeCool

2

我并没有像Brendan Carey的回答中那样使用<errorLog>,因为我只是在内存中记录日志。然而,在我的情况下,他的命令非常有效,而且不需要指定应用程序名称:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The application has done something.")));

我确实需要使用.NET 4.0重新编译Elmah,因为出现了一个错误,需要System.Web.Abstractions 3.5.0.0版本。如果有人需要,我已经为.NET 4.0编译好的版本在这里(也包含强名称):

http://code.google.com/r/scottstafford-elmah/


1
注意:一旦我切换到使用SQL日志记录,我确实需要ApplicationName。 - Scott Stafford

1
对于我的应用程序,我在 Application_Start 中保存了 this.Context.ApplicationInstance ,以便我可以使用保存的实例调用 Elmah.ErrorSignal.Get。有了 ErrorSignal,我就可以使用 Raise。这将通过所有电子邮件过滤器。
以下是代码。我使用 FluentScheduler 来
public class Global : HttpApplication {
    void Application_Start(object sender, EventArgs e) {

        var application = Context.ApplicationInstance;
        FluentScheduler.TaskManager.UnobservedTaskException +=
            (FluentScheduler.Model.TaskExceptionInformation i, UnhandledExceptionEventArgs a) =>
                Elmah.ErrorSignal.Get(application).Raise(i.Task.Exception);

    }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接