Я использовал System.Diagnostics.EventLog для просмотра журналов на локальном компьютере. Однако я хотел бы открыть сохраненный архив журнала событий (.evt или .evtx) и просмотреть журналы, содержащиеся в сохраненном файле. Мне просто нужно просмотреть временные метки, сообщения, источники и т. д., связанные с журналами в файле. Можно ли это сделать на С#?
Как открыть сохраненный архив журнала событий в .NET?
Ответы (3)
Проверьте пространство имен System.Diagnostics.Eventing.Reader
. В частности, класс EventLogQuery
.
http://msdn.microsoft.com/en-us/library/bb671200(v=VS.90).aspx
Попробуйте инструмент 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;
}
Если вы хотите прочитать сохраненные журналы, мы можем сделать это с помощью EventLogReader. В основном он принимает два параметра - имя файла (как в пути к файлу) и второй параметр, указывающий тип пути. Для справки, скажем, у вас есть сохраненный файл .evtx — temp.evtx, вы можете прочитать его следующим образом:
new EventLogReader(filepath, PathType.Filepath);
Это дает вам средство чтения журнала событий, которое можно использовать для чтения событий. И более того, если вы хотите прочитать содержимое из него, мы можем использовать свойства, которые в основном представляют собой список строк. Можете прочитать его, разобрать и получить любую необходимую информацию.
Я согласен с тем, что у нас нет возможности напрямую получать все детали, как то, что мы получаем с помощью EventLogEntry. Тем не менее, нам просто нужно выполнить некоторый синтаксический анализ, чтобы получить то, что нам нужно, используя запись события.