2010-01-21 12 views
42

Genero un hilo en Application_Start y me gustaría registrar excepciones. No hay Context/HttpContext/HttpContext.Current, entonces, ¿cómo podría lograr que se registre?elmah: excepciones sin HttpContext?

Por el momento, no capta ninguna excepción en mis hilos y si escribo ErrorSignal.FromCurrentContext().Raise(ex); me sale un error sobre el contexto no puede ser nulo.

Tal vez pueda crear un HttpContext ficticio pero de alguna manera no creo que funcione bien.

-edit- Intenté ErrorSignal.Get(new HttpApplication()).Raise(ex); y no parece detectar esta excepción.

Respuesta

71

Asegúrese de configurar el nombre de la aplicación en web.config

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

y luego

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

funcionará

+0

¡Gracias! ¡Lo aprecié mucho! –

+0

¿Cómo se configura el nombre de su aplicación en web.config? – chobo2

+1

@ chobo2 - Edité la respuesta de Brendan para que pueda ver su ejemplo de web.config – amurra

2

No estaba usando <errorLog> como en la respuesta de Brendan Carey porque solo estaba registrando en la memoria. Sin embargo, su mando funcionó muy bien en mi caso sin nombrar a la aplicación:

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

tuve que volver a compilar Elmah con .NET 4.0, debido a un error sobre la necesidad System.Web.Abstractions 3.5.0.0. Mi compiled-for-.NET 4.0 tenedor es aquí si alguien lo quiere (también fuerte nomenclatura):

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

+0

NOTA: Una vez que cambié a usar el registro de sql, necesitaba ApplicationName. –

1

Para mi solicitud, me salvaron this.Context.ApplicationInstance en Application_Start para que pueda llamar Elmah.ErrorSignal.Get con la instancia salvado. Con el ErrorSignal, podría entonces Raise. Esto pasa por todos los filtros de correo electrónico.

A continuación se muestra el código. Yo uso FluentScheduler a

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

    } 
} 
Cuestiones relacionadas