2009-07-15 8 views
54

मैं अपने सी # कोड में इवेंट व्यूअर को लिखने की कोशिश कर रहा हूं, लेकिन मुझे अद्भुत "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के इंस्टेंस पर सेट नहीं किया गया है" संदेश मिल रहा है। मैं इस कोड के साथ कुछ मदद की सराहना करता हूं, या तो इसमें क्या गलत है या इसे करने का एक बेहतर तरीका भी है। यहाँ मैं क्या है है ईवेंट लॉग करने के लिए लिखने के लिए:सी # इवेंट व्यूअर को लिखना

private void WriteToEventLog(string message) 
{ 
    string cs = "QualityDocHandler"; 
    EventLog elog = new EventLog(); 
    if (!EventLog.SourceExists(cs)) 
    { 
     EventLog.CreateEventSource(cs, cs); 
    } 
    elog.Source = cs; 
    elog.EnableRaisingEvents = true; 
    elog.WriteEntry(message); 
} 

और यहाँ है जहाँ मैं इसे कहते हैं कोशिश कर रहा हूँ:

private readonly Random _rng = new Random(); 
private const string _chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
private string RandomString(int size) 
{ 
    try 
    { 
     char[] buffer = new char[size]; 
     for (int i = 0; i < size; i++) 
     { 
      buffer[i] = _chars[_rng.Next(_chars.Length)]; 
     } 
     return new string(buffer); 
    } 
    catch (Exception e) 
    { 
     WriteToEventLog(e.ToString()); 
     return null; 
    } 
} 
+0

क्या लाइन पर त्रुटि है? – NikolaiDante

+0

कृपया एक स्टैक ट्रेस –

+1

"ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के इंस्टेंस पर सेट नहीं है" - इसका मतलब है कि आप एक नल का संदर्भ दे रहे हैं, यह कोड की रेखा को जानना बहुत उपयोगी है, जहां यह होता है, क्योंकि तब आप देख सकते हैं कि यह क्या है क्या यह पूर्ण है कि आप संदर्भ दे रहे हैं। –

उत्तर

87

समस्या शायद है कि आप एक लॉग में एक इवेंट स्रोत बनाने की कोशिश कर रहे हैं जो मौजूद नहीं है। आपको "एप्लिकेशन" लॉग निर्दिष्ट करना होगा।

if (!EventLog.SourceExists(cs)) 
    EventLog.CreateEventSource(cs, "Application");  

EventLog.WriteEntry(cs, message, EventLogEntryType.Error); 

इसके अलावा:

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

22

यहाँ कैसे मैं घटना लॉगिंग लागू किया है।

interface ILogger 
{ 
    void Debug(string text); 

    void Warn(string text); 

    void Error(string text); 
    void Error(string text, Exception ex); 
} 

मेरे कार्यान्वयन वर्ग बहुत सरल है::

class EventLogger : ILogger 
{ 
    public void Debug(string text) 
    { 
     EventLog.WriteEntry("MyAppName", text, EventLogEntryType.Information); 
    } 

    public void Warn(string text) 
    { 
     EventLog.WriteEntry("MyAppName", text, EventLogEntryType.Warning); 
    } 

    public void Error(string text) 
    { 
     EventLog.WriteEntry("MyAppName", text, EventLogEntryType.Error); 
    } 

    public void Error(string text, Exception ex) 
    { 
     Error(text); 
     Error(ex.StackTrace); 
    } 
} 

ध्यान दें कि मैं इवेंटलॉग का दृष्टांत नहीं है तो मैं अलग प्रवेश तंत्र में स्वैप कर सकते हैं मैं एक सामान्य ILogger इंटरफ़ेस बनाया। मेरी लकड़हारा वर्ग का उपयोग करने के मैं सिर्फ निम्नलिखित संदर्भ है (यदि आप यह एक स्थिर कारखाने विधि द्वारा वापस हो सकता था):

private static readonly ILogger log = new EventLogger(); 

और वास्तविक उपयोग इस तरह है:

try 
{ 
    // business logic 
} 
catch (Exception ex) 
{ 
    log.Error("Exception in MyMethodName()", ex); 
} 
+11

अच्छा है, लेकिन इसका वास्तविक प्रश्न ओओ –

+8

सच है, लेकिन मेरे पास काम करने के लिए कोई स्टैकट्रैक नहीं है। – Nelson

+0

यह वास्तव में प्रश्न का उत्तर देगा, अगर आपने डिफॉल्ट कन्स्ट्रक्टर 'if (! EventLog.SourceExists (स्रोत)) में यह जांचने के लिए कहा है कि यह मौजूद है, और एक 'कॉन्स स्ट्रिंग स्रोत' जिसे आपने कोड में सेट किया है (या के माध्यम से प्रोप या कन्स्ट्रक्टर ओवरराइड) और कक्षा के माध्यम से पुन: उपयोग करें।फिर हर बार जब आप EventLogger क्लास को तुरंत चालू करते हैं तो यह सुनिश्चित करता है कि ओपी अनुभवी वास्तविक त्रुटि न हो। मैंने इस कोड को स्वीकृत उत्तर के साथ संयुक्त किया। +1 – ppumkin

1
private void WriteEventLogToFile() 
    { 
     try 
     { 
      using (EventLog eventLog = new EventLog("Application")) 
      { 
      // source for your event 
       eventLog.Source = "IAStorDataMgrSvc"; 

      // Syntax details 
      // eventLog.WriteEntry("details",type of event,event id); 
      eventLog.WriteEntry("Hard disk Failure details", EventLogEntryType.Information, 11); 
      } 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
    }