42

我在 Application_Start 上生成了一个线程并希望记录异常。没有Context/HttpContext/HttpContext.Current,那么我怎样才能让它记录呢?

目前,它没有在我的线程中捕获任何异常,如果我写ErrorSignal.FromCurrentContext().Raise(ex);,我得到一个关于上下文不能为空的错误。

也许我可以创建一个虚拟的 HttpContext 但不知何故我认为这不会很好。

-edit-我试过ErrorSignal.Get(new HttpApplication()).Raise(ex);了,它似乎没有发现那个异常。

4

4 回答 4

73

确保在 web.config 中设置应用程序名称

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

进而

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

将工作

于 2010-02-04T00:39:26.863 回答
2

我没有<errorLog>像 Brendan Carey 的回答那样使用,因为我只是在内存中记录。尽管如此,他的命令在我的情况下效果很好,没有命名应用程序:

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

由于需要 System.Web.Abstractions 3.5.0.0 的错误,我不得不用 .NET 4.0 重新编译 Elmah。如果有人想要,我的为 .NET 4.0 编译的分支就在这里(也是强命名):

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

于 2012-05-08T13:45:24.963 回答
1

对于我的应用程序,我保存this.Context.ApplicationInstance了,Application_Start以便可以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);

    }
}
于 2014-09-17T19:27:40.887 回答
0

我添加了一个解决方案:在控制台应用程序中使用 ELMAH,除了日志记录之外,它还增加了发送电子邮件、推文和过滤器的功能。

于 2010-03-22T15:14:47.513 回答