Мы немного поговорили о чтении существующих журналов в комментариях. Можно получить доступ к журналам с тегами Security
, обратившись к:
var eventLog = new EventLog("Security");
for (int i = 0; i < eventLog.Entries.Count; i++)
{
Console.WriteLine($"{eventLog.Entries[i].Message}");
}
Это может быть не самым чистым (с точки зрения производительности) способомделать это, но я сомневаюсь, что любой другой будет быстрее, как вы сами уже поняли, пробуя различные методы.Небольшой дуэт редактирования в пост Алоиса: EventLogReader
не быстрее из коробки, чем EventLog
, особенно при использовании механизма for-loop
, показанного в блоке кода выше, я думаю, EventLog
быстрее - он только получает доступэлементы внутри цикла, использующие их индекс, коллекция Entries
является просто ссылкой, тогда как при использовании EventLogReader
она сначала выполнит запрос и выполнит цикл по этому результату, который должен быть медленнее.Как прокомментировал пост Алоиса: если вам не нужно использовать опцию запроса, просто используйте вариант EventLog
.Если вам нужен запрос, используйте запрос EventLogReader
as is на более низком уровне, чем при использовании EventLog
(только запросы LINQ, что, конечно, медленнее, чем запрос при выполнении поиска).
Чтобы не допустить повторения этой проблемы в будущем, и поскольку вы сказали, что запускаете службу, я бы использовал событие EntryWritten класса EventLog :
var eventLog = new EventLog("Security")
{
EnableRaisingEvents = true
};
eventLog.EntryWritten += EventLog_EntryWritten;
// .. read existing logs or do other work ..
private static void EventLog_EntryWritten(object sender, EntryWrittenEventArgs e)
{
Console.WriteLine($"received new entry: {e.Entry.Message}");
}
Обратите внимание, что необходимо установить для EnableRaisingEvents значение true
, чтобы событие срабатывало при регистрации новой записи.Также будет хорошей практикой (также с точки зрения производительности) запускать (например) Task , чтобы система не блокировалась при постановке в очередь вызовов на ваше событие.
Этот подход хорошо работает, если вы хотите получить все вновь созданные события, если вы хотите получить вновь созданные события, но использовать запрос (фильтр) для этих событий, вы можете проверить EventLogWatcher класс, но в вашем случае, когда нет никаких ограничений, я бы просто использовал событие EntryWritten
, потому что вам не нужны фильтры и для простой старой простоты.