2010-01-21 5 views
42

Je génère un thread sur Application_Start et souhaite enregistrer des exceptions. Il n'y a pas de Context/HttpContext/HttpContext.Current, alors comment pourrais-je l'enregistrer?elmah: exceptions sans HttpContext?

Pour l'instant, il n'attrape aucune exception dans mes threads et si j'écris ErrorSignal.FromCurrentContext().Raise(ex); je reçois une erreur sur le contexte ne peut pas être nulle. Peut-être que je peux créer un HttpContext factice, mais je ne pense pas que cela fonctionne bien.

-edit- J'ai essayé ErrorSignal.Get(new HttpApplication()).Raise(ex); et il ne semble pas prendre cette exception.

Répondre

71

Assurez-vous de définir votre nom d'application dans web.config

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

puis

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

travaillera

+0

Merci! Je l'ai beaucoup apprécié! –

+0

Comment définir le nom de votre application dans web.config? – chobo2

+1

@ chobo2 - J'ai édité la réponse de Brendan afin que vous puissiez voir son exemple web.config – amurra

2

Je n'utilisais pas <errorLog> comme dans la réponse de Brendan Carey parce que j'étais seulement en train d'enregistrer en mémoire. Néanmoins, son commandement a très bien fonctionné dans mon cas sans nommer l'application:

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

j'avais recompiler Elmah avec .NET 4.0, en raison d'une erreur au sujet de besoin System.Web.Abstractions 3.5.0.0. Mon compiled-for-.NET 4.0 fourchette est ici si quelqu'un veut (aussi nommer forte):

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

+0

REMARQUE: Une fois que je suis passé à l'utilisation de la journalisation SQL, j'ai eu besoin d'ApplicationName. –

1

Pour mon application, je sauvé this.Context.ApplicationInstance dans Application_Start afin que je puisse appeler Elmah.ErrorSignal.Get avec l'instance enregistrée. Avec le ErrorSignal, je pourrais alors Raise. Cela passe par tous les filtres de messagerie.

Ci-dessous le code. J'utilise 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); 

    } 
}