Как открыть сохраненный архив журнала событий в .NET?

Я использовал System.Diagnostics.EventLog для просмотра журналов на локальном компьютере. Однако я хотел бы открыть сохраненный архив журнала событий (.evt или .evtx) и просмотреть журналы, содержащиеся в сохраненном файле. Мне просто нужно просмотреть временные метки, сообщения, источники и т. д., связанные с журналами в файле. Можно ли это сделать на С#?


person Brian    schedule 08.06.2010    source источник


Ответы (3)


Проверьте пространство имен System.Diagnostics.Eventing.Reader. В частности, класс EventLogQuery.

http://msdn.microsoft.com/en-us/library/bb671200(v=VS.90).aspx

person Chris    schedule 08.06.2010

Попробуйте инструмент LogParser от Microsoft. Он может извлекать любые данные из журналов любого формата, используя SQL-подобный язык выбора. Его также можно использовать из любого приложения .NET. Пример разбора логов CSV (думаю, вы можете использовать этот код для файлов EVT с небольшими изменениями):

        public IList<LogRow> GetLog()
        {
            return Load("SELECT *, OUT_ROW_NUMBER() FROM logfile*.log WHERE Field2='Performance' ORDER BY Field1 ASC");
        }

    private static IList<LogRow> Load(string sql)
    {
        IEnumerable<string[]> log = ParseLog(sql);

        return Convert(log);
    }

    private static IList<LogRow> Convert(IEnumerable<string[]> log)
    {
        return log.Select(logRecord => new LogRow
                                           {
                                               TimeStamp = logRecord[2],
                                               Category = logRecord[3],
                                               Machine = logRecord[4],
                                               ThreadId = logRecord[5],
                                               ProcessId = logRecord[6],
                                               ProcessName = logRecord[7],
                                               DomainName = logRecord[8],
                                               Message = logRecord[9],
                                               Number = logRecord[10]
                                           }).ToList();
    }


        private static IEnumerable<string[]> ParseLog(string query)
        {
            var records = new LogQueryClassClass().Execute(
                query,
                new COMCSVInputContextClass { headerRow = false, iTsFormat = "yyyy-MM-dd HH:mm:ss.fff" });
            var entries = new List<string[]>();

            while (!records.atEnd())
            {
                entries.Add(records.getRecord().toNativeString("CSVseparator").Split(
                                new[] { "CSVseparator" },
                                StringSplitOptions.None));
                records.moveNext();
            }

            records.close();
            return entries;
        }
person Yauheni Sivukha    schedule 08.06.2010

Если вы хотите прочитать сохраненные журналы, мы можем сделать это с помощью EventLogReader. В основном он принимает два параметра - имя файла (как в пути к файлу) и второй параметр, указывающий тип пути. Для справки, скажем, у вас есть сохраненный файл .evtx — temp.evtx, вы можете прочитать его следующим образом:

new EventLogReader(filepath, PathType.Filepath);

Это дает вам средство чтения журнала событий, которое можно использовать для чтения событий. И более того, если вы хотите прочитать содержимое из него, мы можем использовать свойства, которые в основном представляют собой список строк. Можете прочитать его, разобрать и получить любую необходимую информацию.

Я согласен с тем, что у нас нет возможности напрямую получать все детали, как то, что мы получаем с помощью EventLogEntry. Тем не менее, нам просто нужно выполнить некоторый синтаксический анализ, чтобы получить то, что нам нужно, используя запись события.

person Vinay Jagannath    schedule 03.10.2017