2009-08-18 15 views
6

मैं अपवाद आवेदन ब्लॉक (EHAB) लॉग में Exception.Data संपत्ति से मान लिखने के लिए हैंडलिंग कैसे मिलता है?Exception.Data जानकारी EntLib लॉग में याद आ रही है

try 
    { 
    // ... 
    } 
    catch (Exception ex) 
    { 
    ex.Data.Add("Hello", "World"); 
    throw ex; 
    } 

अपवाद सही ढंग से लॉग ऑन है, लेकिन मैं जोड़ा डेटा EHAB द्वारा बनाई लॉग प्रविष्टि में कहीं भी नहीं मिल रहा।

जहां तक ​​मैं समझता हूँ, यह उपरोक्त उदाहरण की तरह अपवाद ही करने के लिए अतिरिक्त प्रासंगिक जानकारी जोड़ने का सुझाव व्यवहार है। यही कारण है कि मैं थोड़ा आश्चर्यचकित हूं कि ईएचएबी डिफ़ॉल्ट रूप से इसे शामिल नहीं करता है।

मैं EntLib पाठ फ़ॉर्मेटर टेम्पलेट संपादक (नीचे स्क्रीन शॉट) के साथ टेम्पलेट को संशोधित करके इसे ठीक कर सकते हैं? मुझे प्रदान किए गए विभिन्न "टोकन" पर कोई जानकारी नहीं मिल रही है, लेकिन मुझे लगता है कि उत्तर उनके साथ कहीं छिपा हुआ है।

Text Formatter Template Editor http://img195.imageshack.us/img195/6614/capturegmg.png

या मैं वास्तव में यह पूरा करने के लिए अपने स्वयं के कस्टम पाठ फ़ॉर्मेटर को लागू करने की जरूरत है?

संपादित करें/अद्यतन:

मैं आदेश मेरी कोड में हर जगह HandleException विधि कॉल जोड़ने के लिए होने से बचने के लिए मेरी Global.asax.cs में ऐसा करते हैं:

using EntLib = Microsoft.Practices.EnterpriseLibrary; 
using System; 

namespace MyApp 
{ 
    public class Global : System.Web.HttpApplication 
    { 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     // I have an "All Exceptions" policy in place... 
     EntLib.ExceptionHandling.ExceptionPolicy.HandleException(Server.GetLastError(), "All Exceptions"); 
     // I believe it's the GetLastError that's somehow returning a "lessor" exception 
    } 
    } 
} 

यह पता चला इस नहीं इस रूप में ही है (जो ठीक काम करता है, और अनिवार्य रूप मेरी समस्या का हल):

try 
{ 
    // ... 
} 
catch (Exception ex) 
{ 
    ex.Data.Add("Hello", "World"); 
    bool rethrow = ExceptionPolicy.HandleException(ex, "Log Only Policy"); 
    throw ex; 
} 

सभी कोड के माध्यम से जाकर और हैंडलएक्सप्शन कॉल के साथ ट्राइक-कैच जोड़ना बस लगता है ... अच्छा, बेवकूफ। मुझे लगता है कि मेरी समस्या वास्तव में है ईएचएबी सही ढंग से कॉन्फ़िगरेशन का उपयोग करें।

कोई सुझाव नहीं कि मैं ठीक से एएसपी.NET वेब एप्लिकेशन में "वैश्विक स्तर" पर सभी अपवादों को लॉग इन कर सकता हूं ??

+0

मैं हैंडलएक्सप्शन से सहमत हूं: एक ढांचे के रूप में, "अगर रीथ्रो" निर्माण वास्तव में बहुत अधिक अमूर्तता प्रदान नहीं करता है; आपको अभी भी प्रत्येक पकड़ ब्लॉक में "अगर रीथ्रो" कोड के साथ अपना कोड मिर्च करने की आवश्यकता है। –

उत्तर

7

आप अपनी खुद की फ़ॉर्मेटर बनाने के लिए नहीं होना चाहिए।

अपवाद वस्तु पर डाटा IDictionary में प्रत्येक आइटम LogEntry वस्तु की ExtendedProperties शब्दकोश में जोड़ा जाता है और लॉग होता है (यदि संरूपक द्वारा निर्दिष्ट)।

विस्तारित गुण: {शब्दकोश ({कुंजी} - {} मूल्य)} config टुकड़ा सभी कुंजी/मान जोड़े लोग इन में विस्तारित गुण शब्दकोश चाहिए। यदि आप संग्रह से केवल एक आइटम लॉग करना चाहते हैं तो आप "keyvalue" का उपयोग कर सकते हैं। अपने उदाहरण में यह की तर्ज पर कुछ होगा: Data.Add ("हैलो", "दुनिया") जोड़ने के लिए

Hello Key: {keyvalue(Hello)} 


मैं संशोधित ExceptionHandlingWithLoggingQuickStart और मैं देख रहा हूँ "विस्तारित गुण: हैलो - दुनिया" इवेंट लॉग एंट्री के अंत में। तो यह काम कर रहा है।

आपको लगता है कि व्यवहार नहीं देख रहे हैं, तो आप यह सुनिश्चित करने की जरूरत है:

  • जोड़ा डाटा आइटम के साथ अपने अपवाद ExceptionPolicy करने में पारित हो जाता है।HandleException
  • नीति HandleException विधि में विनिर्दिष्ट विन्यास
  • में एक LoggingExceptionHandler साथ प्रवेश करने फ़ॉर्मेटर कि LoggingConfiguration में निर्दिष्ट किया जाता ExtendedProperties


आप कर सकते हैं, तो समर्थन करने के लिए कॉन्फ़िगर किया गया है कि के लिए कॉन्फ़िगर किया गया है कि क्विक स्टार्ट में जो कुछ है उसके मुकाबले समस्या की तुलना करने में समस्या क्या है, यह देखने की कोशिश नहीं है। यदि यह अभी भी काम नहीं कर रहा है, तो अपना कोड और अपनी कॉन्फ़िगरेशन पोस्ट करें।

अद्यतन:

आप Global.asax में Application_Error को संभालने के लिए तो आप एक HttpUnhandledException प्राप्त होगा के बाद से पेज त्रुटि संभाल नहीं किया जा रहे हैं। आप इनरएक्सप्शन प्रॉपर्टी का उपयोग कर उस अपवाद को पुनः प्राप्त कर सकते हैं जिसमें आप रुचि रखते हैं; InnerException में मूल अपवाद होगा (जब तक कि वह उस अपवाद के इनरएक्सप्शन में नहीं है :))। वैकल्पिक रूप से, आप मूल कारण मूल अपवाद पुनर्प्राप्त करने के लिए Server.GetLastError().GetBaseException() का उपयोग कर सकते हैं।

+0

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

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