2010-06-07 4 views
13

मैं हर पकड़ ब्लॉक में लॉगिंग करने में सक्षम होना चाहता हूं। कुछ इस तरह।फ़ाइल में अपवाद कैसे लॉग करें?

catch (Exception exception) 
{ 
    Logger.Write(exception); 
} 

और फिर कॉन्फ़िगरेशन में सेटिंग्स ग्राहक श्रोता का उपयोग करके संदेश और स्टैकट्रेस संपत्ति आदि उठाएगी।

मैं एंटरप्राइज़ लाइब्रेरी लॉगिंग एप्लिकेशन ब्लॉक का उपयोग करना चाहता हूं। मुझे यकीन है कि किसी ने पहले से ही यह किया होगा।

उत्तर

31

अन्य ने लॉगिंग एप्लिकेशन ब्लॉक (एलएबी) काम करने के कुछ अच्छे लिंक पोस्ट किए हैं, इसलिए मैं यहां डुप्लिकेट नहीं करूंगा।

  1. डिफ़ॉल्ट Exception.ToString() क्रियान्वयन का उपयोग करें (यह बुरा नहीं है)
  2. लिखें कस्टम फ़ॉर्मेटर कि प्रयोगशाला में एकीकृत:

    अपने अपवाद स्वरूपण के संदर्भ में आप 3 विकल्प है कि मैं के बारे में सोच सकते हैं।

  3. एक सहायक कार्य लिखें जो स्वरूपण करता है और स्ट्रिंग को विधि विधि में पास करता है।

यदि विकल्प 1 आपकी आवश्यकताओं को पूरा नहीं करता है तो मैं विकल्प 3 के साथ जाने की सलाह दूंगा (क्योंकि विकल्प 2 ओवरकिल है)। की तरह कुछ

एक साधारण उदाहरण होगा:

catch (Exception exception) 
    { 
     Logger.Write(LogHelper.CreateExceptionString(exception)); 
    } 

    ... 

    public static string CreateExceptionString(Exception e) 
    { 
     StringBuilder sb = new StringBuilder(); 
     CreateExceptionString(sb, e, String.Empty); 

     return sb.ToString(); 
    } 

    private static void CreateExceptionString(StringBuilder sb, Exception e, string indent) 
    { 
     if (indent == null) 
     { 
      indent = String.Empty; 
     } 
     else if (indent.Length > 0) 
     { 
      sb.AppendFormat("{0}Inner ", indent); 
     } 

     sb.AppendFormat("Exception Found:\n{0}Type: {1}", indent, e.GetType().FullName); 
     sb.AppendFormat("\n{0}Message: {1}", indent, e.Message); 
     sb.AppendFormat("\n{0}Source: {1}", indent, e.Source); 
     sb.AppendFormat("\n{0}Stacktrace: {1}", indent, e.StackTrace); 

     if (e.InnerException != null) 
     { 
      sb.Append("\n"); 
      CreateExceptionString(sb, e.InnerException, indent + " "); 
     } 
    } 
+0

अपवाद के प्रकार को शामिल करना भी सहायक है। लेकिन अन्यथा काफी अच्छा है। –

+1

@Andrew: हाँ या आप डेटा संपत्ति से IDictionary निकालने के लिए कुछ कोड जोड़ सकते हैं। –

+0

[यहां] (http://www.aspsnippets.com/Articles/Create-imple- त्रुटि- लॉग- टेक्स्ट- फ़ाइल-in-ASPNet-using-C-and-VBNet.aspx) एक और ** समाधान ** है ** । उम्मीद मदद करता है। – stom

0

आपको टेक्स्ट फ़ाइलों के लिए उचित श्रोता जोड़ने की आवश्यकता है - this पोस्ट देखें, यह एएसपी.नेट के लिए है लेकिन कॉन्फ़िगरेशन फ़ाइलें अनुप्रयोगों में एक ही तरह से काम करती हैं।

+0

मैं कुछ करना सीधे अपवाद वस्तु पारित करने के लिए इतना है कि यह विस्तृत स्टैक ट्रेस देता कर सकते हैं पूछ रहे हैं आदि जो डीबगिंग में सहायक होंगे। – IsmailS

4

माइक्रोसॉफ्ट इस यहाँ पर व्यापक मार्गदर्शन प्रदान की गई है: Developing Applications Using the Logging Application Block

यह अच्छी तरह से है कि वे क्या, क्या कहना है के रूप में यह काफी शक्तिशाली है की जानकारी प्राप्त लायक है।

आप थोड़ा और पृथ्वी पर कुछ चाहते हैं, कुछ काम कर रहे उदाहरण इस ब्लॉग लेख में प्रदान की जाती हैं: How To Configure and Use the Logging Application Block

आप अब भी उन पढ़ने के बाद समस्या हो रही है, क्या बारे में अधिक विशिष्ट विवरण के साथ अपनी पोस्ट को संपादित लगता है कि समस्या है।

+0

क्या मैं सीधे अपवाद ऑब्जेक्ट को पास करने के लिए कुछ कर सकता हूं ताकि यह विस्तृत स्टैक ट्रेस इत्यादि दे सके जो डीबगिंग में सहायक होगा? – IsmailS

+0

आप एक बहुत ही सरल विधि और/या string.format टेम्पलेट बना सकते हैं और फिर Logger.Write को कॉल करते समय इसका उपयोग कर सकते हैं। –

+0

कॉन्फ़िगर लिंक सीधे विज्ञापन पर जाता है। – sweetfa

1

@iSid इस है क्या आप के लिए

public static void printException(Exception ex){ 
       Console.WriteLine("HelpLink = {0}", ex.HelpLink); 
       Console.WriteLine("Message = {0}", ex.Message); 
       Console.WriteLine("Source = {0}", ex.Source); 
       Console.WriteLine("StackTrace = {0}", ex.StackTrace); 
       Console.WriteLine("TargetSite = {0}", ex.TargetSite); 

      }