예제 #1
0
        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);
                    }
                }
            }
        }
예제 #2
0
        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;
        }