2012-04-11 4 views
6

मुझे इवेंटलॉग से आने वाली घटनाओं को संसाधित करने की आवश्यकता है। EventRecordWritten ईवेंट से अटैचमेंट EventLogWatcher का उपयोग करना आसान है। हालांकि जिस प्रश्न में मुझे रूचि है (eventid == 299 || eventid == 500) मुझे जो चाहिए उससे ज्यादा घटनाएं प्रदान करता है। यहाँ धाराइवेंट लॉग से प्रोसेसिंग इवेंट्स और एक निश्चित पैटर्न (आरएक्स?) पर प्रतिक्रिया दें

Event ID Correlation ID 
299  1AD... (this is actually a guid) X1 
500  1AD...        X2 
500  1AD... 
500  1AD... 
299  43B...        Y1 
299  EDB...        Z1 
500  43B...        Y2 
500  EDB...        Z2 
500  43B... 
500  43B... 

मैं घटना 299 और पहली घटना 500 कि 299 घटना के सहसंबंध आईडी से मेल खाता है में दिलचस्पी का एक उदाहरण है। मैं उनके ऊपर धारा में चिह्नित, कि उत्पादन संग्रह मैं में दिलचस्पी है: [X1, X2, Y1, Y2, Z1, Z2] जो शायद एक शब्दकोश एक कुंजी के रूप सहसंबंध आईडी और मूल्य के रूप में EventRecord की एक टपल उपयोग कर रहा है

{ 1AD.., <X1, X2> } 
{ 43B.., <Y1, Y2> } 
{ EDB.., <Z1, Z2> } 

सामान्य घटनाओं आ सकते में क्रम में (2 9 9 और फिर 500) लेकिन एक उच्च समेकन की स्थिति में मैंने दो 29 9 घटनाओं को एक साथ आने और फिर 500 घटनाओं की भविष्यवाणी की, इसलिए मैं घटनाओं के आदेश पर भरोसा नहीं करना चाहता हूं। सहसंबंध आईडी उनसे सहसंबंध करने की कुंजी है (जो eventRecord.Properties[0] घटना की पहली संपत्ति है)

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

अद्यतन: यहां समाधान का उत्तर दिया गया है। धन्यवाद गिदोन यह बिल्कुल शुरुआती बिंदु था जिसकी मुझे आवश्यकता थी!

var pairs = events 
      .Where(e299 => e299.EventArgs.EventRecord.Id == 299) 
      .SelectMany(e299 => events.Where(e500 => e500.EventArgs.EventRecord.Id == 500 && 
                e299.EventArgs.EventRecord.Properties[0].Value.ToString() == 
                e500.EventArgs.EventRecord.Properties[0].Value.ToString()) 
            .Take(1), 
         (e299, e500) => new { First = e299, Second = e500 }); 

अग्रिम धन्यवाद, मटीस

उत्तर

5

यदि 2 9 9 कार्यक्रम हमेशा 500 घटनाओं से पहले आते हैं, SelectMany और Where पर्याप्त होना चाहिए।

var events; //declared somewhere 

var pairs = from e299 in events 
      where e299.eventid == 299 
      from e500 in events 
      where e500.eventid == 500 && 
        e299.Correlation == e500.Correlation 
      select new with {Correlation = e299.Correlation, 
          First = e299, 
          Second = e500} 

अपने स्रोत से प्रत्येक के लिए एक से अधिक 500 घटनाओं 299 घटना सहसंबद्ध होते हैं तो आप लैम्ब्डा वाक्य रचना करने के लिए स्विच और दूसरे सदस्यता के लिए एक Take(1) जोड़ने की जरूरत हो सकती है।

+0

पर स्पॉट! धन्यवाद गिडोन ... लैम्ब्डा का उपयोग करने और क्वेरी (1) को मेरे उत्तर – woloski

0

मैं नहीं जानता कि आप "एक राज्य मशीन" के साथ क्या मतलब है।

लेकिन आप एक पर्यवेक्षक कि एकत्र करता है (EventID == 299 || EventID == 500) लिख सकते हैं। थ्रॉटल रणनीति का उपयोग करना (आखिरी 1000 घटनाओं को इकट्ठा करना, या नवीनतम मिनट, मुझे नहीं पता), यह एक घटना को बढ़ाता है जब यह घटनाओं की एक जोड़ी का पता लगाता है 29 9, 500 में एक ही गाइड होता है, फिर इसके आंतरिक शब्दकोश/सूची से हटाया जाता है आयोजन।

फिर, उस तरह के पर्यवेक्षक आपके सिस्टम के बाकी के लिए मानने योग्य है।

हो सकता है कि एक सूची घटनाओं,

events.Where (ई => e.eventid == newevent.eventid & & ((e.id = की तरह कुछ इकट्ठा किया जा सकता है, और जब एक नई घटना का पता चला है = 299 & & newev.id == 500) || (e.id == 500 & & newev.id == 299))

प्रदर्शन में पर्याप्त हो सकता है, बजाय GUID द्वारा एक शब्दकोश होने के।

बाद में मिलते हैं, मैथ्यू!

+0

धन्यवाद एंजेल ... घटनाओं को भड़काना और उनका विश्लेषण करना मेरा पहला दृष्टिकोण था। मैं कुछ शुद्ध आरएक्स चाहता था। – woloski

2

आपको पर्यवेक्षण का उपयोग करना चाहिए। जब, जॉइन के साथ। इससे आपको जटिल इच्छा पैटर्न जैसे आप की इच्छा लिखने की अनुमति मिल जाएगी।

उदाहरण के लिए, https://stackoverflow.com/a/3868608/13131 और Guide to System.Reactive.Joins देखें।

+0

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

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