2010-01-21 14 views
42

मैं एप्लिकेशन_स्टार्ट पर एक धागा उत्पन्न करता हूं और अपवाद लॉग करना चाहता हूं। कोई Context/HttpContext/HttpContext.Current नहीं है, तो मैं इसे लॉग इन करने के लिए कैसे प्राप्त कर सकता हूं?elmah: HttpContext के बिना अपवाद?

फिलहाल, यह मेरे धागे में कोई अपवाद नहीं पकड़ता है और यदि मैं ErrorSignal.FromCurrentContext().Raise(ex); लिखता हूं तो मुझे संदर्भ के बारे में कोई त्रुटि नहीं मिल सकती है।

शायद मैं एक डमी एचटीपी कॉन्टेक्स्ट बना सकता हूं लेकिन किसी भी तरह से मुझे नहीं लगता कि यह अच्छी तरह से काम करेगा।

-edit- मैंने ErrorSignal.Get(new HttpApplication()).Raise(ex); की कोशिश की और ऐसा लगता है कि यह अपवाद नहीं है।

उत्तर

71

सुनिश्चित करें कि आप web.config में आपके आवेदन नाम सेट

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

और फिर

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

काम करेंगे

+0

धन्यवाद! मैंने बहुत सराहना की! –

+0

आप अपना आवेदन नाम web.config में कैसे सेट करते हैं? – chobo2

+1

@ chobo2 - मैंने ब्रेंडन का जवाब संपादित किया ताकि आप उसका वेब.कॉन्फिग उदाहरण – amurra

0

मैं के लिए एक समाधान जोड़ा बनाओ: कि ईमेल भेजने की क्षमता कहते हैं Using ELMAH in a console application लॉगिंग के अलावा ट्वीट्स और फिल्टर।

2

मैं <errorLog> का उपयोग ब्रेंडन केरी के उत्तर में नहीं कर रहा था क्योंकि मैं केवल मेमोरी लॉगिंग था। फिर भी, उनके आदेश के आवेदन नामकरण के बिना मेरे मामले में महान काम किया:

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

मैं System.Web.Abstractions 3.5.0.0 की आवश्यकता होगी, के बारे में किसी त्रुटि के कारण .NET 4.0 के साथ Elmah पुन: संयोजित करने के लिए, था।

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

+0

नोट: एक बार जब मैंने एसक्यूएल लॉगिंग का उपयोग करने के लिए स्विच किया, तो मुझे एप्लिकेशन नाम की आवश्यकता थी। –

1

अपने आवेदन के लिए, मैं Application_Start में this.Context.ApplicationInstance बचाया, ताकि मैं बचाया उदाहरण के साथ Elmah.ErrorSignal.Get कॉल कर सकते हैं: अगर किसी को भी यह (भी मजबूत नामकरण) चाहता है मेरे compiled-for-.NET 4.0 कांटा यहाँ है। ErrorSignal के साथ, मैं Raise कर सकता था। यह सभी ईमेल फ़िल्टर के माध्यम से चला जाता है।

नीचे कोड है। मैं 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); 

    } 
} 
संबंधित मुद्दे