I spawn a thread on Application_Start and would like to log exceptions. There is no Context/HttpContext/HttpContext.Current, so how might I get it to log?
At the moment, it does not catch any exception in my threads and if I write ErrorSignal.FromCurrentContext().Raise(ex); I get an error about context cannot be null.
Maybe I can create a dummy HttpContext but somehow I don’t think that will work well.
-edit- I tried ErrorSignal.Get(new HttpApplication()).Raise(ex); and it doesn’t seem to pick up that exception.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
Make sure you set your application name in web.config
<errorLog type="Elmah.SqlErrorLog, Elmah"
connectionStringName="nibWeb"
applicationName="Nib.Services" />
and then
ErrorLog.GetDefault(null).Log(new Error(error));
will work
Method 2
I wasn’t using <errorLog> as in Brendan Carey’s answer because I was only in-memory logging. Nevertheless, his command worked great in my case without naming the application:
Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The application has done something.")));
I DID have to recompile Elmah with .NET 4.0, because of an error about needing System.Web.Abstractions 3.5.0.0. My compiled-for-.NET 4.0 fork is here if anyone wants it (also strong naming):
http://code.google.com/r/scottstafford-elmah/
Method 3
For my application, I saved this.Context.ApplicationInstance in Application_Start so that I can call Elmah.ErrorSignal.Get with the saved instance. With the ErrorSignal, I could then Raise. This goes through all the email filters.
Below is the code. I use FluentScheduler to
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);
}
}
Method 4
I added a solution to: Using ELMAH in a console application that adds ability to send email, tweets and filter in addition to logging.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0