private void LoadFile() { textboxFileName.Text = FileName; _Entries.Clear(); listView1.ItemsSource = null; DateTime dt = new DateTime(1970, 1, 1, 0, 0, 0, 0); string sXml = string.Empty; string sBuffer = string.Empty; int iIndex = 1; Clear(); try { FileStream oFileStream = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); StreamReader oStreamReader = new StreamReader(oFileStream); sBuffer = string.Format("<root>{0}</root>", oStreamReader.ReadToEnd()); oStreamReader.Close(); oFileStream.Close(); #region Read File Buffer //////////////////////////////////////////////////////////////////////////////// StringReader oStringReader = new StringReader(sBuffer); XmlTextReader oXmlTextReader = new XmlTextReader(oStringReader); oXmlTextReader.Namespaces = false; while (oXmlTextReader.Read()) { if ((oXmlTextReader.NodeType == XmlNodeType.Element) && (oXmlTextReader.Name == "log4j:event")) { LogEntry logentry = new LogEntry(); logentry.Item = iIndex; double dSeconds = Convert.ToDouble(oXmlTextReader.GetAttribute("timestamp")); logentry.TimeStamp = dt.AddMilliseconds(dSeconds).ToLocalTime(); logentry.Thread = oXmlTextReader.GetAttribute("thread"); #region get level //////////////////////////////////////////////////////////////////////////////// logentry.Level = oXmlTextReader.GetAttribute("level"); switch (logentry.Level) { case "ERROR": { logentry.Image = LogEntry.Images(LogEntry.IMAGE_TYPE.ERROR); break; } case "INFO": { logentry.Image = LogEntry.Images(LogEntry.IMAGE_TYPE.INFO); break; } case "DEBUG": { logentry.Image = LogEntry.Images(LogEntry.IMAGE_TYPE.DEBUG); break; } case "WARN": { logentry.Image = LogEntry.Images(LogEntry.IMAGE_TYPE.WARN); break; } case "FATAL": { logentry.Image = LogEntry.Images(LogEntry.IMAGE_TYPE.FATAL); break; } default: { logentry.Image = LogEntry.Images(LogEntry.IMAGE_TYPE.CUSTOM); break; } } //////////////////////////////////////////////////////////////////////////////// #endregion #region read xml //////////////////////////////////////////////////////////////////////////////// while (oXmlTextReader.Read()) { if (oXmlTextReader.Name == "log4j:event") // end element { break; } else { switch (oXmlTextReader.Name) { case ("log4j:message"): { logentry.Message = oXmlTextReader.ReadString(); break; } case ("log4j:data"): { switch (oXmlTextReader.GetAttribute("name")) { case ("log4jmachinename"): { logentry.MachineName = oXmlTextReader.GetAttribute("value"); break; } case ("log4net:HostName"): { logentry.HostName = oXmlTextReader.GetAttribute("value"); break; } case ("log4net:UserName"): { logentry.UserName = oXmlTextReader.GetAttribute("value"); break; } case ("log4japp"): { logentry.App = oXmlTextReader.GetAttribute("value"); break; } } break; } case ("log4j:throwable"): { logentry.Throwable = oXmlTextReader.ReadString(); break; } case ("log4j:locationInfo"): { logentry.Class = oXmlTextReader.GetAttribute("class"); logentry.Method = oXmlTextReader.GetAttribute("method"); logentry.File = oXmlTextReader.GetAttribute("file"); logentry.Line = oXmlTextReader.GetAttribute("line"); break; } } } } //////////////////////////////////////////////////////////////////////////////// #endregion _Entries.Add(logentry); iIndex++; #region Show Counts //////////////////////////////////////////////////////////////////////////////// int ErrorCount = ( from entry in Entries where entry.Level == "ERROR" select entry ).Count(); if (ErrorCount > 0) { labelErrorCount.Content = string.Format("{0:#,#} ", ErrorCount); labelErrorCount.Visibility = Visibility.Visible; imageError.Visibility = Visibility.Visible; } else { labelErrorCount.Visibility = Visibility.Hidden; imageError.Visibility = Visibility.Hidden; } int InfoCount = ( from entry in Entries where entry.Level == "INFO" select entry ).Count(); if (InfoCount > 0) { labelInfoCount.Content = string.Format("{0:#,#} ", InfoCount); labelInfoCount.Visibility = Visibility.Visible; imageInfo.Visibility = Visibility.Visible; } else { labelInfoCount.Visibility = Visibility.Hidden; imageInfo.Visibility = Visibility.Hidden; } int WarnCount = ( from entry in Entries where entry.Level == "WARN" select entry ).Count(); if (WarnCount > 0) { labelWarnCount.Content = string.Format("{0:#,#} ", WarnCount); labelWarnCount.Visibility = Visibility.Visible; imageWarn.Visibility = Visibility.Visible; } else { labelWarnCount.Visibility = Visibility.Hidden; imageWarn.Visibility = Visibility.Hidden; } int DebugCount = ( from entry in Entries where entry.Level == "DEBUG" select entry ).Count(); if (DebugCount > 0) { labelDebugCount.Content = string.Format("{0:#,#} ", DebugCount); labelDebugCount.Visibility = Visibility.Visible; imageDebug.Visibility = Visibility.Visible; } else { labelDebugCount.Visibility = Visibility.Hidden; labelDebugCount.Visibility = Visibility.Hidden; } //////////////////////////////////////////////////////////////////////////////// #endregion } } //////////////////////////////////////////////////////////////////////////////// #endregion } catch (Exception ex) { MessageBox.Show(ex.ToString()); } this.listView1.ItemsSource = _Entries; }
/// <summary> /// Loads the file. /// </summary> public void loadFile(string logFileName, bool withMerge = false) { if (!withMerge) { log.Info("Clearing entries to load single log file"); entries.Clear(); log.Info("Notifying Entries property as changed"); notifyPropertyChanged("Entries"); log.Info("Resetting the ListView item source to nothing"); listView1.ItemsSource = null; FileName = logFileName; } else { log.Info("Adding the log files that need to be merged to mergedFile object"); if (mergedFiles.Count == 0) { mergedFiles.Add(FileName); } log.Info("If the same file is being added then return immediately"); if (mergedFiles.Contains(logFileName)) { return; } log.Info("If not add the file to the merged list"); mergedFiles.Add(logFileName); } log.Info("Clearing the log filter"); logFilter.Clear(); log.Info("Turning off the IsFiltered property of the FilterIndicator"); FilterIndicator.IsFiltered = false; var dt = new DateTime(1970, 1, 1, 0, 0, 0, 0); var iIndex = 1; if (withMerge) { iIndex = entries.Count + 1; } clear(); try { log.Info("Initializing FileStream objet to open the log file"); var oFileStream = new FileStream(logFileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); log.Info("Initializing a Stream Reader"); var oStreamReader = new StreamReader(oFileStream); log.Info("Read all the contents in the log file to a StreamReader"); var sBuffer = string.Format("<root>{0}</root>", oStreamReader.ReadToEnd()); log.Info("Closing StreamReader and FileStream object"); oStreamReader.Close(); oFileStream.Close(); #region Read File Buffer //////////////////////////////////////////////////////////////////////////////// log.Info("Reading File"); var oStringReader = new StringReader(sBuffer); var oXmlTextReader = new XmlTextReader(oStringReader) { Namespaces = false }; log.Info("Start reading the log file"); while (oXmlTextReader.Read()) { if ((oXmlTextReader.NodeType != XmlNodeType.Element) || (oXmlTextReader.Name != "log4j:event")) { continue; } var logentry = new LogEntry { Item = iIndex }; // ReSharper disable StringLiteralsWordIsNotInDictionary var dSeconds = Convert.ToDouble(oXmlTextReader.GetAttribute("timestamp")); // ReSharper restore StringLiteralsWordIsNotInDictionary logentry.TimeStamp = dt.AddMilliseconds(dSeconds).ToLocalTime(); logentry.Thread = oXmlTextReader.GetAttribute("thread"); logentry.Logger = oXmlTextReader.GetAttribute("logger"); logentry.LogFile = logFileName; #region get level //////////////////////////////////////////////////////////////////////////////// logentry.Level = oXmlTextReader.GetAttribute("level"); switch (logentry.Level) { case "ERROR": { logentry.Image = LogEntry.Images(LogImageType.Error); break; } case "INFO": { logentry.Image = LogEntry.Images(LogImageType.Info); break; } case "DEBUG": { logentry.Image = LogEntry.Images(LogImageType.Debug); break; } case "WARN": { logentry.Image = LogEntry.Images(LogImageType.Warn); break; } case "FATAL": { logentry.Image = LogEntry.Images(LogImageType.Fatal); break; } default: { logentry.Image = LogEntry.Images(LogImageType.Custom); break; } } //////////////////////////////////////////////////////////////////////////////// #endregion #region read xml //////////////////////////////////////////////////////////////////////////////// while (oXmlTextReader.Read()) { var breakLoop = false; switch (oXmlTextReader.Name) { case "log4j:event": breakLoop = true; break; default: switch (oXmlTextReader.Name) { case ("log4j:message"): { logentry.Message = oXmlTextReader.ReadString(); break; } case ("log4j:data"): { switch (oXmlTextReader.GetAttribute("name")) { case ("log4jmachinename"): { logentry.MachineName = oXmlTextReader.GetAttribute("value"); break; } case ("log4net:HostName"): { logentry.HostName = oXmlTextReader.GetAttribute("value"); break; } case ("log4net:UserName"): { logentry.UserName = oXmlTextReader.GetAttribute("value"); break; } case ("log4net:Identity"): { logentry.Identity = oXmlTextReader.GetAttribute("value"); break; } case ("NDC"): { logentry.NDC = oXmlTextReader.GetAttribute("value"); break; } case ("log4japp"): { logentry.App = oXmlTextReader.GetAttribute("value"); break; } } break; } // ReSharper disable StringLiteralsWordIsNotInDictionary case ("log4j:throwable"): // ReSharper restore StringLiteralsWordIsNotInDictionary { logentry.Throwable = oXmlTextReader.ReadString(); break; } case ("log4j:locationInfo"): { logentry.Class = oXmlTextReader.GetAttribute("class"); logentry.Method = oXmlTextReader.GetAttribute("method"); logentry.File = oXmlTextReader.GetAttribute("file"); logentry.Line = oXmlTextReader.GetAttribute("line"); break; } } break; } if (breakLoop) { break; } } //////////////////////////////////////////////////////////////////////////////// #endregion entries.Add(logentry); iIndex++; } notifyPropertyChanged("Entries"); log.Info("Completing of Log xml reading"); //////////////////////////////////////////////////////////////////////////////// #endregion } catch (Exception ex) { MessageBox.Show(ex.ToString()); } #region Show Counts //////////////////////////////////////////////////////////////////////////////// log.Info("Calculating the number of ERROR in the log file"); var errorCount = ( from entry in Entries where entry.Level == "ERROR" select entry ).Count(); if (errorCount > 0) { labelErrorCount.Text = string.Format("{0:#,#} ", errorCount); labelErrorCount.Visibility = Visibility.Visible; imageError.Visibility = Visibility.Visible; } else { labelErrorCount.Visibility = Visibility.Hidden; imageError.Visibility = Visibility.Hidden; } log.Info("ERROR count is " + errorCount); log.Info("Calculating the number of INFO in the log file"); var infoCount = ( from entry in Entries where entry.Level == "INFO" select entry ).Count(); if (infoCount > 0) { labelInfoCount.Text = string.Format("{0:#,#} ", infoCount); labelInfoCount.Visibility = Visibility.Visible; imageInfo.Visibility = Visibility.Visible; } else { labelInfoCount.Visibility = Visibility.Hidden; imageInfo.Visibility = Visibility.Hidden; } log.Info("INFO count is " + infoCount); log.Info("Calculating the number of WARN in the log file"); var warnCount = ( from entry in Entries where entry.Level == "WARN" select entry ).Count(); if (warnCount > 0) { labelWarnCount.Text = string.Format("{0:#,#} ", warnCount); labelWarnCount.Visibility = Visibility.Visible; imageWarn.Visibility = Visibility.Visible; } else { labelWarnCount.Visibility = Visibility.Hidden; imageWarn.Visibility = Visibility.Hidden; } log.Info("WARN count is " + warnCount); log.Info("Calculating the number of DEBUG in the log file"); var debugCount = ( from entry in Entries where entry.Level == "DEBUG" select entry ).Count(); if (debugCount > 0) { labelDebugCount.Text = string.Format("{0:#,#} ", debugCount); labelDebugCount.Visibility = Visibility.Visible; imageDebug.Visibility = Visibility.Visible; } else { imageDebug.Visibility = Visibility.Hidden; labelDebugCount.Visibility = Visibility.Hidden; } log.Info("DEBUG count is " + debugCount); tbFiltered.Text = Entries.Count().ToString(); FilterIndicator.IsFiltered = false; //////////////////////////////////////////////////////////////////////////////// #endregion log.Info("Initializing ListView to show the log entries"); listView1.ItemsSource = null; log.Info("Loading ListView with Log Entries"); listView1.ItemsSource = (from e in entries orderby e.TimeStamp select e).ToList(); log.Info("Clearing Sort Adorner"); clearSortAdorner(); if (!withMerge) { textboxFileName.Text = logFileName; Title = string.Format(Properties.Resources.WindowTitle + " - " + logFileName, Assembly.GetExecutingAssembly().GetName().Version); log.Info("Setting the title as " + Title); return; } var s = ""; foreach (var sm in mergedFiles) { if (s != "") { s += "; "; } s += Path.GetFileName(sm); } textboxFileName.Text = s; Title = string.Format(Properties.Resources.WindowTitle + " - " + s, Assembly.GetExecutingAssembly().GetName().Version); log.Info("Setting the title as " + Title); }