2010-01-21 6 views
42

Sposto un thread in Application_Start e desidero registrare le eccezioni. Non c'è Context/HttpContext/HttpContext.Current, quindi come posso farlo registrare?elmah: eccezioni senza HttpContext?

Al momento, non cattura alcuna eccezione nei miei thread e se scrivo ErrorSignal.FromCurrentContext().Raise(ex); ottengo un errore sul contesto non può essere nullo.

Forse posso creare un HttpContext fittizio ma in qualche modo non penso che funzionerà bene.

-edit- Ho provato ErrorSignal.Get(new HttpApplication()).Raise(ex); e non sembra raccogliere quell'eccezione.

risposta

71

Assicurati di impostare il nome dell'applicazione in web.config

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

e poi

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

funzionerà

+0

Grazie! L'ho apprezzato molto! –

+0

Come si imposta il nome dell'applicazione in web.config? – chobo2

+1

@ chobo2 - Ho modificato la risposta di Brendan in modo da poter vedere il suo esempio web.config – amurra

2

Non stavo usando <errorLog> come nella risposta di Brendan Carey perché ero solo nella registrazione in memoria. Tuttavia, il suo comando lavorato molto nel mio caso senza nominare l'applicazione:

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

ho dovuto ricompilare Elmah con .NET 4.0, a causa di un errore di circa avere bisogno System.Web.Abstractions 3.5.0.0. Il mio compiled-for-.NET 4.0 forcella è qui, se qualcuno lo vuole (anche forte di denominazione):

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

+0

NOTA: una volta passato a utilizzare la registrazione di sql, avevo bisogno di ApplicationName. –

1

Per la mia applicazione, ho salvato this.Context.ApplicationInstance in Application_Start modo che io possa chiamare Elmah.ErrorSignal.Get con l'istanza salvato. Con lo ErrorSignal, potrei quindi Raise. Questo passa attraverso tutti i filtri e-mail.

Di seguito è riportato il codice. Uso FluentScheduler per

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

    } 
}