Обработка событий из журнала событий и реакция на определенный шаблон (Rx?)

Мне нужно обработать события, поступающие из EventLog. Это легко сделать с помощью EventLogWatcher , присоединенного к событию EventRecordWritten. Однако меня интересует запрос (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..,  }
{ 43B..,  }
{ EDB..,  }

. порядок (299, а затем 500), но в ситуации с высокой степенью параллелизма я предполагаю, что два события 299 объединятся, а затем 500 событий, поэтому я не хочу полагаться на порядок появления событий. Идентификатор корреляции является ключом для их корреляции (, что является первым свойством события eventRecord.Properties[0])

. Я думаю, что это можно решить с помощью конечного автомата, но было бы интересно посмотреть, придумает ли кто-нибудь решение с представленным Rx запросом к наблюдаемому. Это позволит сохранить логику сопоставления с образцом в одном месте.

ОБНОВЛЕНИЕ:вот ответ на решение. Спасибо, Гидеон, это была именно та отправная точка, которая мне была нужна!

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 });

Заранее спасибо. Матиас

6
задан woloski 12 April 2012 в 17:38
поделиться