2011-05-18 17 views
5

मैं एक वेब एप्लिकेशन पर काम कर रहा हूं जो इवेंट व्यूअर के समान इवेंट लॉग डेटा दिखाता है। आवेदन को उपयोगकर्ताओं को इवेंट लॉग की सदस्यता लेने और वेब सेवा का उपयोग करके सब्स्क्राइब किए गए लॉग पर लिखित होने पर नोटिफिकेशन प्राप्त करने का तरीका भी प्रदान करना होगा। कॉलक्या यह बताने का कोई तरीका है कि कौन सा EventLog प्रविष्टि वर्जित घटना सी # में हुई?

EventLog eventLog = new EventLog(observer.logName, observer.machineName); 
eventLog.EnableRaisingEvents = true; 
eventLog.EntryWritten += new EntryWrittenEventHandler(eventLog_EntryWritten); 
eventList.Add(eventLog); 

मैं इवेंट लॉग के लिए ग्राहकों के रूप में पर्यवेक्षकों का उपयोग करने के कोशिश कर रहा हूँ, और एक EventWritten घटना नियंत्रित किया जाता है जब,:

मैं वेब सेवा में एक ईवेंट लॉग की सदस्यता के लिए इस कोड का उपयोग कर रहा हूँ एक पर्यवेक्षक की अद्यतन विधि। समस्या यह है कि, मुझे नहीं पता कि ईवेंट लॉग को कैसे अंतर किया जाए, क्योंकि वे सभी एक ही ईवेंट हैंडलर का उपयोग करते हैं। मैं ऐसा इसलिए कर रहा हूं क्योंकि इवेंट लॉग की संख्या एक मशीन से दूसरे में भिन्न होती है। साथ ही, मैं पर्यवेक्षकों को केवल एक प्रकार का इवेंटलॉग, यानी संभालना चाहता हूं। एप्लिकेशन लॉग में कोई ईवेंट लिखा जाने पर एक पर्यवेक्षक ई-मेल भेजेगा।

मैं वर्तमान कंप्यूटर पर सभी लॉग प्राप्त करने के लिए कोड की इस पंक्ति का उपयोग करें:

remoteEventLogs = EventLog.GetEventLogs(machineName); 

EventWritten ईवेंट हैंडलर इस वस्तु इस पैरामीटर है, लेकिन दृश्य स्टूडियो EventLogInternal, जो मैं उपयोग नहीं कर सकते के रूप में अपने प्रकार से पता चलता , और मैं EventLog.Log प्रॉपर्टी प्राप्त करने के लिए प्रेषक को EventLog पर नहीं डाल सकता। अगर मैं यह कास्ट करने के लिए, इस तरह का प्रयास करें:

void eventLog_EntryWritten(object sender, EntryWrittenEventArgs e) 
    { 
     var log = (EventLog)sender; 
    } 

मैं कह रहा इवेंटलॉग के लिए एक EventLogInternal डाली नहीं कर सकते हैं एक अपवाद मिलता है।

क्या यह जानने का कोई तरीका है कि कौन सा EventLog ईवेंट को सक्रिय करता है?

धन्यवाद

उत्तर

3

एक अन्य विकल्प इन पंक्तियों के साथ प्रतिबिंब का उपयोग करने के होगा:

string log = (string)sender.GetType().GetProperty("Log").GetValue(sender, null); 

sender के बाद से इस मामले में वास्तव में Log संपत्ति है।

+0

अच्छा अस्थायी रूप से हैक। नए नेट फ्रेमवर्क के साथ मुद्दा हो सकता है – Zam

2

मुझे लगता है कि तुम क्या EntryWrittenEventArgs में पाया जा सकता के लिए देख रहे हैं।

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

यहाँ args वर्ग http://msdn.microsoft.com/en-us/library/system.diagnostics.entrywritteneventargs.aspx

यहाँ के लिए एक लिंक एंट्री वर्ग के लिए एक लिंक है http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlogentry.aspx

मैं विशिष्ट ईवेंट लॉग लिए एक सीधा लिंक नहीं दिख रहा है, लेकिन अगर आप प्रहार डीबगर के साथ उस वर्ग के आस-पास एंट्री ऑब्जेक्ट आपको इसे देखने के लिए पर्याप्त जानकारी दे सकता है।

मुझे आशा है कि इससे कुछ मदद मिलेगी।

+0

हाँ है, समस्या है, एंट्री संपत्ति प्रवेश करें जो करने के लिए लिखा जा रहा है के बारे में जानकारी प्रदर्शित नहीं करता है किसी भी प्रकार। – markhan777

4

मुझे लगता है कि समस्या यह है कि EventLog कक्षा की पूरी अवधारणा यह है कि यह मानता है कि यह एक लॉग पर काम करता है - जो यह करता है। तो न तो EventWrittenEventArgs और न ही EventEntry कक्षा एक सदस्य है जिसमें लॉग-नाम होता है, क्योंकि यह संबंधित EventLog-instance द्वारा स्पष्ट रूप से दिया जाता है। बुरा है बेशक, कि आप EventWritten-handler के अंदर नहीं पहुंच सकते हैं।

आप System.Diagnostics.EventLog के चारों ओर एक आवरण बना सकते हैं, तो जैसे:

class MyEventLog : EventLog 
{ 
    public MyEventLog(string logName, string machineName) 
     : base(logName, machineName) 
    { 
     base.EnableRaisingEvents = true; 
     base.EntryWritten += MyEventLog_EntryWritten; 
    } 

    void MyEventLog_EntryWritten(object sender, EntryWrittenEventArgs e) 
    { 
     Console.WriteLine("Entry in {0} log.", base.Log); 

     // Your code 
    } 
} 

फिर स्थानों में MyEventLog का उपयोग जहाँ आप सामान्य रूप EventLog का प्रयोग करेंगे। शायद इसे एक बेहतर नाम दें हालांकि।

आप Action<string, EntryWrittenEventArgs> संपत्ति प्रदान करके "आपका कोड" भाग भी कारक कर सकते हैं जिसे MyEventLog_EntryWritten के अंदर से बुलाया जा रहा है और इसे आपके "बाहरी" हैंडलर फ़ंक्शन पर सेट किया जा सकता है।

+0

इवेंटलॉग के चारों ओर एक रैपर बनाने का विचार नहीं किया है, मैं इसे आज़मा दूंगा। बहुत बहुत धन्यवाद – markhan777

+0

यह आपको ईवेंट हैंडलर के भीतर से लॉग नाम तक पहुंचने की अनुमति नहीं देता है या मुझे कुछ याद आ रहा है। – driverobject

+0

'base.Log' आपको लॉग का नाम देगा। या आप इसे कन्स्ट्रक्टर में सदस्य चर में संग्रहीत कर सकते हैं और ईवेंट हैंडलर (जो एक सदस्य फ़ंक्शन है) के भीतर से एक्सेस कर सकते हैं। –

0

मैं ईसाई द्वारा सुझाए गए अनुसार किसी अन्य वर्ग के भीतर इवेंटलॉग कक्षा को लपेटने के विचार से सहमत हूं। मैंने हाल ही में ऐसी आवश्यकता पर काम किया है।

इस वर्ग मैं बनाया कि

public class EventLogWatcher : EventLog 
{ 
    Action<string, EntryWrittenEventArgs> _changeHandler; 
    public EventLogWatcher(string logName, Action<string, EntryWrittenEventArgs> changeHandler) 
     : base(logName) 
    { 
     _changeHandler = changeHandler; 
    } 

    public void EnableCapture() 
    { 
     base.EnableRaisingEvents = true; 
     base.EntryWritten += EventLogChangeHandler; 
    } 

    public void DisableCapture() 
    { 
     base.EnableRaisingEvents = false; 
     base.EntryWritten -= EventLogChangeHandler; 
    } 

    private void EventLogChangeHandler(object sender, EntryWrittenEventArgs e) 
    { 
     _changeHandler(base.Log, e); 
    } 
} 

यहाँ एक उपयोग

foreach (string eventlogType in LogTypes) 
      logWatchers.Add(new EventLogWatcher(eventlogType, EventLogChangeHandler)); 

     foreach (EventLogWatcher localLog in logWatchers) 
     { 
      try 
      { 
       localLog.EnableCapture(); 
      } 
      catch(Exception ex) 
      { 
       EventManager.PublishExceptionLogMessage(ex); 
      } 
     } 
     EventManager.PublishInfoLogMessage($"Started EventLog listeners for {string.Join(",", LogTypes)} logs"); 

private void EventLogChangeHandler(string eventLogType, EntryWrittenEventArgs e) 
    { 
     try 
     { 
      if (UploadAllowed(eventLogType, e)) 
      { 

       Dm.EventLog model = _eventLogEntryMapper.MapEntryToModel(e); 
       Task.Factory.StartNew(
         () => _eventLogUploadService.UploadEventLog(model), 
         _cancellationTokenProvider.Token, 
         TaskCreationOptions.None, 
         TaskScheduler.Default); 
      } 
     } 
     catch(Exception ex) 
     { 
      EventManager.PublishExceptionLogMessage(ex); 
     } 

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

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