2011-09-16 23 views
241

क्या ELMAH का उपयोग करके निम्नलिखित करना संभव है?त्रुटियों को मैन्युअल रूप से लॉग इन करने के लिए ELMAH का उपयोग कैसे करें

logger.Log(" something"); 

मैं कुछ इस तरह कर रहा हूँ:

try 
{ 
    // Code that might throw an exception 
} 
catch(Exception ex) 
{ 
    // I need to log error here... 
} 

यह अपवाद स्वचालित रूप से, ELMAH द्वारा लॉगिन नहीं किया जाएगा क्योंकि यह संभाला।

+1

भविष्य के संदर्भ के लिए, मैंने बिल्कुल इस बारे में एक पोस्ट लिखा था: [लॉगिंग त्रुटियां प्रोग्रामेटिक रूप से] (http://docs.elmah.io/logging-errors-programmatically/)। मेरा [ELMAH ट्यूटोरियल] (http://blog.elmah.io/elmah-tutorial/) इसके बारे में कुछ जानकारी भी है। – ThomasArdal

उत्तर

383

प्रत्यक्ष लॉग लेखन विधि, ELMAH 1.0 के बाद से काम कर रहे:

try 
{ 
    some code 
} 
catch(Exception ex) 
{ 
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
} 

वहाँ एक है:

try 
{ 
    some code 
} 
catch(Exception ex) 
{ 
    Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex)); 
} 

ELMAH 1.2 एक और अधिक लचीला API का परिचय दो समाधानों के बीच अंतर:

  • Raise विधि अपवाद के लिए ELMAH फ़िल्टरिंग नियम लागू करती है। Log विधि नहीं है।
  • Raise सदस्यता आधारित है और कई लॉगर्स में एक अपवाद लॉग इन करने में सक्षम है।
+1

आपकी विधि और दूसरों के बीच क्या अंतर है? – Omu

+0

ईएलएमएएच 1.0 –

+0

के बाद से काम करता है क्या आपके रास्ते को लॉगिंग और बढ़ने के बीच कोई अंतर है? – Omu

16
catch(Exception ex) 
{ 
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
} 
28

आप अपवाद उठाए बिना किसी समस्या को लॉग करने के लिए Elmah.ErrorSignal() विधि का उपयोग कर सकते हैं।

try 
{ 
    // Some code 
} 
catch(Exception ex) 
{ 
    // Log error 
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 

    // Continue 
} 
14

हां, यह संभव है। ELMAH को अनचाहे अपवादों को रोकने के लिए डिज़ाइन किया गया था। हालांकि आप त्रुटि सिग्नल क्लास के माध्यम से ELMAH के अपवाद को सिग्नल कर सकते हैं। उन अपवादों को फेंक दिया नहीं जाता है (बबल अप न करें), लेकिन केवल ईएलएमएएच (और त्रुटि सिग्नल क्लास के उदय घटना के ग्राहकों को) भेजा जाता है।

एक छोटा सा उदाहरण:

protected void ThrowExceptionAndSignalElmah() 
{ 
    ErrorSignal.FromCurrentContext().Raise(new NotSupportedException()); 
} 
87

मैं एल्मा को अपने आप के एक साधारण रैपर वर्ग में कॉल को लपेटने की अनुशंसा करता हूं।

using Elmah; 

public static class ErrorLog 
{ 
    /// <summary> 
    /// Log error to Elmah 
    /// </summary> 
    public static void LogError(Exception ex, string contextualMessage=null) 
    { 
     try 
     { 
      // log error to Elmah 
      if (contextualMessage != null) 
      { 
       // log exception with contextual information that's visible when 
       // clicking on the error in the Elmah log 
       var annotatedException = new Exception(contextualMessage, ex); 
       ErrorSignal.FromCurrentContext().Raise(annotatedException, HttpContext.Current); 
      } 
      else 
      { 
       ErrorSignal.FromCurrentContext().Raise(ex, HttpContext.Current); 
      } 

      // send errors to ErrorWS (my own legacy service) 
      // using (ErrorWSSoapClient client = new ErrorWSSoapClient()) 
      // { 
      // client.LogErrors(...); 
      // } 
     } 
     catch (Exception) 
     { 
      // uh oh! just keep going 
     } 
    } 
} 

तब जब भी आपको किसी त्रुटि को लॉग करने की आवश्यकता होती है तो उसे कॉल करें।

try { 
    ... 
} 
catch (Exception ex) 
{ 
    // log this and continue 
    ErrorLog.LogError(ex, "Error sending email for order " + orderID); 
} 

यह निम्न लाभ हैं:

  • आप Elmah कॉल के इस थोड़ा पुरातन वाक्य रचना को याद करने के
  • आप कई DLLs है, तो आप संदर्भ के लिए Elmah की जरूरत नहीं है की जरूरत नहीं है प्रत्येक से कोर - और बस इसे अपने 'सिस्टम' डीएलएल में रखें।
  • यदि आपको कभी भी कोई विशेष हैंडलिंग करने की आवश्यकता है या केवल त्रुटियों को डीबग करने के लिए ब्रेकपॉइंट डालना चाहते हैं तो आपके पास यह सब एक ही स्थान है।
  • यदि आप कभी भी एल्मा से दूर चले जाते हैं तो आप केवल एक स्थान बदल सकते हैं।
  • यदि आपके पास विरासत त्रुटि लॉगिंग है जिसे आप बनाए रखना चाहते हैं (मुझे बस एक साधारण त्रुटि लॉगिंग तंत्र होना है जो कुछ यूआई में बंधे हैं जिनके पास तुरंत निकालने का समय नहीं है)।

नोट: मैंने प्रासंगिक जानकारी के लिए 'प्रासंगिक संदेश' संपत्ति जोड़ दी है। यदि आप पसंद करते हैं तो आप इसे छोड़ सकते हैं लेकिन मुझे यह बहुत उपयोगी लगता है। एल्मा स्वचालित रूप से अपवादों को अनचाहे करता है ताकि अंतर्निहित अपवाद अभी भी लॉग में रिपोर्ट किया जा सके लेकिन प्रासंगिक मैसेज तब दिखाई देगा जब आप उस पर क्लिक करेंगे।

+1

शानदार उत्तर है। शायद ELMAH को बॉक्स के बाहर कुछ लागू करना चाहिए। संदर्भ के बिना किसी त्रुटि को कभी-कभी डीबग करना मुश्किल होता है। – ra00l

+2

मुझे सभी पसंद है लेकिन किसी भी माध्यमिक त्रुटियों को निगलने के साथ '// ओह ओह! बस चलते रहो। अगर मेरी त्रुटि प्रबंधन विफल हो रही है तो मैं जानना चाहता हूं। मैं इसे कुछ शोर बनाना चाहता हूं। –

+3

@ जेरेमीक्यूक मैं सहमत हूं, लेकिन चेतावनी के साथ कि यदि आप सावधान नहीं हैं, तो असफल होने में त्रुटि निवारण दिनचर्या खुद को बुलाकर समाप्त हो जाती है और फिर उड़ाती है (ओह और मैं वास्तव में त्रुटि लॉग करने के लिए यहां एक तृतीय पक्ष एपीआई भी कॉल कर रहा था)। मुझे शायद इस जवाब के लिए यह नहीं छोड़ा जाना चाहिए था, लेकिन –

11

मैं एक ही थ्रेड में ऐसा करने के लिए देख रहा था, मैंने अपने एमवीसी 4 एप्लिकेशन के भीतर से मेल कतार शुरू कर दिया था, क्योंकि मेरे पास अपवाद उठाए जाने पर HttpContext उपलब्ध नहीं था। उत्तर की तरह प्रदान की

<elmah> 
    <security allowRemoteAccess="false" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ELMAH" applicationName="myApplication"/> 
</elmah> 
तब कोड में

(ऐसा करने के लिए मैं इस सवाल के आधार पर निम्न के साथ समाप्त हो गया और एक अन्य जवाब यहाँ पर पाया: elmah: exceptions without HttpContext?

कॉन्फ़िग फ़ाइल मैं एक आवेदन नाम निर्दिष्ट में इसके बाद के संस्करण, लेकिन HttpContext के बिना) आप एक HttpContext के बजाय अशक्त पारित कर सकते हैं:

ThreadPool.QueueUserWorkItem(t => { 
    try { 
     ... 
     mySmtpClient.Send(message); 
    } catch (SomeException e) { 
     Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(e)); 
    } 
}); 
+0

मुझे आपका समाधान पसंद है; हालांकि, मैं "एल्माह" को हल करने में असमर्थ हूं। मेरी परियोजना में मैंने "एल्मा का उपयोग करके" जोड़ने की कोशिश की; मेरे कोड में, लेकिन यह मेरे वर्तमान संदर्भ में मौजूद नहीं है। – Taersious

+0

@ टायरियस आपके 'packages.config' जैसा दिखता है? क्या आप कुछ ऐसा देखते हैं: '' '' '<पैकेज आईडी =" elmah.sqlserver "संस्करण =" 1.2 "targetFramework =" net45 "/> ''? क्या आपने NuGET के साथ स्थापित किया था? – Matthew

+0

मैं हाँ कहना चाहूंगा, लेकिन मेरी परियोजना वर्तमान में स्रोत नियंत्रण में बंद है। मैंने परियोजना में नमूना विन्यास फाइल से मैन्युअल रूप से elmah लागू किया। – Taersious

2

कुछ मामलों CurrentHttpContext में उपलब्ध नहीं हो सकता।

परिभाषित

public class ElmahLogger : ILogger 
{ 
    public void LogError(Exception ex, string contextualMessage = null, bool withinHttpContext = true) 
    { 
     try 
     { 
      var exc = contextualMessage == null 
         ? ex 
         : new ContextualElmahException(contextualMessage, ex); 
      if (withinHttpContext) 
       ErrorSignal.FromCurrentContext().Raise(exc); 
      else 
       ErrorLog.GetDefault(null).Log(new Error(exc)); 
     } 
     catch { } 
    } 
} 

उपयोग

public class MyClass 
{ 
    readonly ILogger _logger; 

    public MyClass(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void MethodOne() 
    { 
     try 
     { 

     } 
     catch (Exception ex) 
     { 
      _logger.LogError(ex, withinHttpContext: false); 
     } 
    } 
} 
0

मैं Signal.FromCurrentContext() का उपयोग कर elmah लॉग में कस्टम संदेश लिखने के लिए कोशिश कर रहा था उठाएँ (पूर्व)। और पाया कि इन अपवादों बुलबुले कर रहे हैं जैसे:

try 
{ 
    ... 
} 
catch (Exception ex) 
{ 
    Elmah.ErrorSignal.FromCurrentContext().Raise(ex); 
    // this will write to the log AND throw the exception 
} 

इसके अलावा मैं नहीं देख सकते कि elmah लॉगिंग के विभिन्न स्तरों का समर्थन करता है - यह एक web.config सेटिंग से वर्बोज़ लॉगिंग बंद करने के लिए संभव है?

+1

यदि आप एक अपवाद पकड़ते हैं और इसे फिर से नहीं फेंकते हैं, अपवाद बबल अप नहीं करता है। शायद मैं गलत समझ सकता हूँ? ELMAH लॉगिंग के विभिन्न स्तरों का समर्थन नहीं करता है। यह केवल त्रुटियों के लिए है। – ThomasArdal

+0

धन्यवाद, थॉमस। यही वही है जो मैं पुष्टि करने की कोशिश कर रहा था –

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