using System; using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Tango.Integration.Operation; using Tango.Logging; using Tango.Settings; namespace Tango.Integration.Logging { public class EmbeddedLogFileParser : ILogFileParser { public List GetLogFiles() { List logFiles = new List(); FileLogger logger = MachineOperator.EmbeddedLogManager.RegisteredLoggers.FirstOrDefault(x => x.GetType() == typeof(FileLogger)) as FileLogger; String logFile = logger != null ? logger.LogFile : null; HashSet dateStrings = new HashSet(); if (Directory.Exists(MachineOperator.EmbeddedLogsFolder)) { foreach (var file in Directory.GetFiles(MachineOperator.EmbeddedLogsFolder, "*.log").Where(x => x != logFile)) { try { String dateString = Path.GetFileNameWithoutExtension(file).Replace(MachineOperator.EmbeddedLogsTag + "-", ""); int indexPos = dateString.IndexOf(FileLogger.FILE_SET_EXTENSION); int indexOfFile = 0; if (indexPos > 0) { string fileNameIndex = dateString.Substring(indexPos + FileLogger.FILE_SET_EXTENSION.Length); int.TryParse(fileNameIndex, out indexOfFile); dateString = dateString.Substring(0, indexPos); } if (!dateStrings.Contains(dateString)) { dateStrings.Add(dateString); DateTime date = DateTime.ParseExact(dateString, "dd-MM-yyyy_HH-mm-ss", CultureInfo.InvariantCulture); logFiles.Add(new LogFile() { DateTime = date, File = file, PartOfSet = indexOfFile > 0, }); } } catch (Exception ex) { LogManager.Default.Log(ex, $"Could not load embedded log file {Path.GetFileName(file)}"); } } } return logFiles; } public List Parse(LogFile logFile) { List logItems = new List(); List logFiles = new List(); FileLogger logger = LogManager.Default.RegisteredLoggers.FirstOrDefault(x => x.GetType() == typeof(FileLogger)) as FileLogger; if (logFile.PartOfSet) { string fileName = Path.GetFileNameWithoutExtension(logFile.File); string extension = Path.GetExtension(logFile.File); int indexPos = fileName.IndexOf(FileLogger.FILE_SET_EXTENSION); if (indexPos > 0) { fileName = fileName.Substring(0, indexPos); } string[] fileEntries = Directory.GetFiles(FileLogger.DefaultLogsFolder, $"{fileName}*{extension}").Where(x => Path.GetFileName(x).StartsWith(logger.Tag) && x != logger.LogFile).OrderBy(x => x).ToArray(); foreach (var file in fileEntries) { Parse(file, logFile.DateTime, ref logItems); } } else { Parse(logFile.File, logFile.DateTime, ref logItems); } return logItems; } public void Parse(string file, DateTime datetime, ref List logItems) { String text = File.ReadAllText(file); var logs = Regex.Split(text, @"(\[\d{2}:\d{2}:\d{2}.\d{2}\])"); for (int i = 1; i < logs.Length; i += 2) { try { DateTime date = DateTime.ParseExact(logs[i].Replace("[", "").Replace("]", ""), "HH:mm:ss.ff", CultureInfo.InvariantCulture); String rest = logs[i + 1]; var entries = Regex.Split(rest, @"\[(.*?)\]"); EmbeddedLogItem item = new EmbeddedLogItem(new PMR.Debugging.StartDebugLogResponse() { Category = (PMR.Debugging.DebugLogCategory)Enum.Parse(typeof(PMR.Debugging.DebugLogCategory), entries[1]), FileName = entries[3], LineNumber = int.Parse(entries[5]), ModuleId = int.Parse(entries[7]), Filter = int.Parse(entries[9]), Message = new String(entries[10].Skip(2).ToArray()) }); item.TimeStamp = new DateTime(datetime.Year, datetime.Month, datetime.Day, date.Hour, date.Minute, date.Second, date.Millisecond); logItems.Add(item); } catch (Exception ex) { LogManager.Default.Log(ex, "Could not parse log line: " + logs[i]); } } } public List Parse(string file, DateTime fileDate) { List logs = new List(); Parse(file, fileDate, ref logs); return logs; } } }