2010-01-21 10 views
42

Ich spawne einen Thread auf Application_Start und möchte Ausnahmen protokollieren. Es gibt keine Context/HttpContext/HttpContext.Current, also wie kann ich es loggen?elmah: Ausnahmen ohne HttpContext?

Im Moment fängt es keine Ausnahme in meinen Threads und wenn ich schreibe ErrorSignal.FromCurrentContext().Raise(ex); bekomme ich einen Fehler über Kontext kann nicht null sein.

Vielleicht kann ich einen Dummy-HttpContext erstellen, aber irgendwie glaube ich nicht, dass das gut funktionieren wird.

-edit- Ich versuchte ErrorSignal.Get(new HttpApplication()).Raise(ex); und es scheint nicht diese Ausnahme aufzuheben.

Antwort

71

Stellen Sie sicher stellen Sie Ihren Anwendungsnamen in web.config

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

und dann

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

arbeiten

+0

Vielen Dank! Ich habe es sehr geschätzt! –

+0

Wie legen Sie Ihren Anwendungsnamen in der Datei web.config fest? – chobo2

+1

@ chobo2 - Ich habe Brendans Antwort bearbeitet, so dass Sie sein Beispiel web.config sehen können. – amurra

2

Ich habe nicht <errorLog> wie in Brendan Carey's Antwort verwendet, weil ich nur speicherinternen Protokollierung war. Trotzdem arbeitete seinen Befehl groß in meinem Fall, ohne die Anwendung zu benennen:

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

Ich habe Elmah neu kompilieren mit .NET 4.0, aufgrund eines Fehlers über System.Web.Abstractions 3.5.0.0 benötigen. My compiled-for-.NET 4.0 Gabel ist hier, wenn jemand es will (auch starke Namensgebung):

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

+0

Hinweis: Sobald ich SQL-Protokollierung verwendet, brauchte ich ApplicationName. –

1

Für meine Anwendung, ich sparte this.Context.ApplicationInstance in Application_Start so dass ich Elmah.ErrorSignal.Get mit der gespeicherten Instanz aufrufen können. Mit der ErrorSignal könnte ich dann Raise. Dies geht durch alle E-Mail-Filter.

Unten ist der Code. Ich verwende FluentScheduler zu

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); 

    } 
} 
Verwandte Themen