public IEnumerable<LogMessage> ReadLogs(string fileName) { var result = new List<LogMessage>(); bool isMultiline = false; //является ли текущее сообщение многострочным StringBuilder builder = new StringBuilder(); // читаем файл полностью, чтобы не держать его долго открытым // если файл может быть большим, то лучше читать его построчно using (var file = File.OpenText(fileName)) { string fileLine; while((fileLine = file.ReadLine()) != null) { if(fileLine.Contains(lineEnd)) { var messageStr = fileLine.Replace(lineEnd, string.Empty); if(isMultiline) { builder.Append(messageStr); messageStr = builder.ToString(); isMultiline = false; builder.Clear(); } var message = new LogMessage(); if (_parser.TryParse(messageStr, out message)) { yield return message; } } else { isMultiline = true; builder.Append(fileLine); } } } }
public bool TryParse(string str, out LogMessage message) { message = new LogMessage(); var result = false; if (str.IsNullOrWhiteSpace()) return result; var regex = new Regex(msgPattern); if (!regex.IsMatch(str)) return result; var matches = str.Split(new string[] { partsSeparator }, StringSplitOptions.RemoveEmptyEntries); //парсинг типа сообщения if (matches.Length > 0) { var content = GetContent(matches[0]); message.Type = ParseType(content); } //парсинг даты if (matches.Length > 1) { var content = GetContent(matches[1]); message.Date = ParseDate(content); } //парсинг сообщения if (matches.Length > 2) { var content = GetContent(matches[2]); message.Message = content; } result = message.Type.HasValue || message.Date.HasValue || !message.Message.IsNullOrWhiteSpace(); return result; }