Подтвердить что ты не робот

Каков самый быстрый способ чтения журнала событий на удаленном компьютере?

Я работаю над приложением, которое читает журнал событий (приложение) с удаленных компьютеров. Я использую класс EventLog в .net, а затем повторяю записи в журнале, но это очень медленно. В некоторых случаях на некоторых машинах есть 40000+ записей журнала, и для повторения записей требуется несколько часов. Каков наилучший способ выполнить эту задачу? Существуют ли какие-либо другие классы в .net, которые быстрее или в любой другой технологии?

4b9b3361

Ответ 1

Человек, я чувствую твою боль. У нас была такая же проблема в нашем приложении.

Ваше решение имеет ветку в зависимости от версии сервера, на которой вы работаете, и на какой версии сервера работает ваша целевая машина.

Если вы оба на Vista или Windows Server 2008, вам повезло. Вы должны посмотреть System.Diagnostics.Eventing.Reader.EventLogQuery и System.Diagnostics.Eventing.Reader.EventLogReader. Они новы в .net 3.5.

В принципе, вы можете построить запрос в XML и отправить его для запуска на удаленном компьютере. Возможно, вы просто ищете события определенного типа или, возможно, просто новые события с определенного момента времени. Поиск выполняется на удаленном компьютере, а затем вы просто возвращаете соответствующие события. Новые классы намного быстрее, чем старый .net 2.0, но опять же, они поддерживаются только в Vista или Windows Server 2008.

Для нашего приложения, когда цель НЕ находится в Vista/Win2008, мы загрузили исходный файл .evt из удаленной системы и затем проанализировали файл, используя его двоичный формат. Существует несколько источников данных о формате журнала событий для файлов .evt(pre-Vista), включая текст ссылки и статью, которую я помню codeproject.com, который имел некоторый код С#.

Машины Vista и Windows Server 2008 используют новый формат .evtx, который является новым форматом, поэтому вы не можете использовать один и тот же метод двоичного разбора во всех версиях. Но новые классы EventLogQuery и EventLogReader так быстрей, что вам не придется. Теперь просто быстро использовать только встроенные классы.

Ответ 2

Журнал регистрации событий ужасно медленный... слишком медленный. WTF Microsoft?

Использовать LogParser 2.2 - Поиск С# и LogParser в Интернете (или вы можете использовать команды анализатора журнала из командной строки). Я не хочу дублировать работу, уже внесенную другими.

Я вытаскиваю журнал из удаленной системы, экспортируя журнал как файл EVTX. Затем я копирую файл из удаленной системы. Этот процесс очень быстрый - даже с сетью, которая охватывает планету (у меня были проблемы с журналом, экспортированным на сетевой ресурс). После того, как у вас есть локальный, вы можете выполнять поиск и обработку.

Есть несколько причин для EVTX - я не буду объяснять причины, почему мы это делаем.

Ниже приведен рабочий пример кода для сохранения копии журнала как EVTX: (Notes: "device" - это имя сетевого хоста или IP-адрес. "LogName" - это имя требуемого журнала: "System", "Security" или "Application". OutputPathOnRemoteSystem - это путь на удаленном компьютере, например, C:\Temp\%имя хоста%% LogName%% YYYYMMDD_HH.MM%.evtx").

..
    static public bool DumpLog(string device, string LogName, string outputPathOnRemoteSystem, out string errMessage)
    {
        bool wasExported = false;
        string errorMessage = "";
        try
        {
            System.Diagnostics.Eventing.Reader.EventLogSession els = new System.Diagnostics.Eventing.Reader.EventLogSession(device);
            els.ExportLogAndMessages(LogName, PathType.LogName, "*", outputPathOnRemoteSystem);
            wasExported = true;

        }
        catch (UnauthorizedAccessException e)
        {
            errorMessage = "Unauthorized - Access Denied: " + e.Message;
        }
        catch (EventLogNotFoundException e)
        {
            errorMessage = "Event Log Not Found: " + e.Message;
        }
        catch (EventLogException e)
        {
            errorMessage = "Export Failed: " + e.Message + ", Log: " + LogName + ", Device: " + device;
        }
        errMessage = errorMessage;
        return wasExported;
    }

Ответ 3

Хорошее объяснение/пример можно найти на MSDN.

EventLogSession session = new EventLogSession(Environment.MachineName);

// [System/Level=2] filters out the errors
// Where "Log" is the log you want to get data from.
EventLogQuery query = new EventLogQuery("Log", PathType.LogName, "*[System/Level=2]");

EventLogReader reader = new EventLogReader(query);

for (EventRecord eventInstance = reader.ReadEvent();
    null != eventInstance;
    eventInstance = reader.ReadEvent())
{
    // Output or save your event data here.
}

При ожидании 5-20 минут со старым кодом это делает это менее чем за 10 секунд.

Ответ 4

Возможно, WMI может вам помочь:

WMI с С#

Ответ 5

Пробовали ли вы использовать функции удаленного доступа в powershell 2.0? Они позволяют выполнять командлеты (например, журналы чтения журналов событий) на удаленных компьютерах и возвращать результаты (как объекты, конечно) на вызывающий сеанс.

Ответ 6

Вы можете разместить программу на тех машинах, которые сохраняют журнал в файл и отправляют его на ваш веб-приложение. Я думаю, что это было бы намного быстрее, поскольку вы можете делать петлю локально, но я не уверен, как это сделать, поэтому я не могу вас убедить любой код: (

Ответ 7

Я недавно сделал это через интерфейс обратного вызова WCF, однако мои клиенты взаимодействовали с сервером через WCF, и в моем проекте было легко добавить обратный вызов WCF, полный код с примерами доступен здесь here

Ответ 8

Возможно, удаленные компьютеры могут немного вычислить. Таким образом, ваш сервер будет иметь дело только с соответствующей информацией. Это был бы своего рода кластер, использующий удаленный компьютер, чтобы сделать небольшую фильтрацию света, и сервер будет частью анализа.