Что вы можете сделать, это использовать Regex
, чтобы попытаться сопоставить каждую строку журнала.Если у вас есть совпадение, вы создаете запись, в противном случае вы добавляете строку к существующей записи.Я предоставлю код, чтобы попытаться объяснить подход ...
//strings for simplification, in your code you should use DateTime and parse properly
public class Entry
{
public string Timestamp { get; set; }
public string Type { get; set; }
public string Description { get; set; }
}
Тогда вы можете определить regular expression
для захвата строки журнала.Я сделал это с помощью групп, чтобы было легче извлечь данные из него.Обратите внимание, что вы должны добавить все типы, которые вы ожидаете, я просто использую info|error|warning
.
//you should define all types you expect in log, I just put info and error
string LogLineRegex = @"(?<date>\d{4}\d{2}\d{2} \d{2}:\d{2}:\d{2}.\d{3}) (?<type>info|error|warning) (?<text>.*)";
, а затем прочитать каждую строку журнала:
- match - создать новую запись
- не совпадает - добавить строку к скользящей записи, предполагается, что у вас есть ошибка
Пример анализа журнала
Entry rollingEntry = null;
foreach (var line in log)
{
var match = Regex.Match(line, LogLineRegex);
if (match.Success)
{
if (rollingEntry != null) { entries.Add(rollingEntry); }
rollingEntry = new Entry{
Timestamp = match.Groups["date"].ToString(),
Type = match.Groups["type"].ToString(),
Description = match.Groups["text"].ToString() };
}
else
{
if (rollingEntry != null) { rollingEntry.Description += $"{Environment.NewLine}{line}"; }
}
}