private static void ProcessChildNodes(XmlReader xmlTextReader, LogEntry entry)
 {
     while (xmlTextReader.Read())
     {
         var hasNoMoreChildToProcess = ProcessChildNode(xmlTextReader, entry);
         if (hasNoMoreChildToProcess)
             break;
     }
 }
 private static bool ProcessChildNode(XmlReader xmlTextReader, LogEntry entry)
 {
     switch (xmlTextReader.Name)
     {
         case "log4j:event":
             return true;
         case ("log4j:message"):
             entry.Message = xmlTextReader.ReadString();
             break;
         case ("log4j:data"):
             ProcessDataTag(xmlTextReader, entry);
             break;
         case ("log4j:throwable"):
             entry.Throwable = xmlTextReader.ReadString();
             break;
         case ("log4j:locationInfo"):
             SetLocationInfo(entry, xmlTextReader);
             break;
     }
     return false;
 }
 private static void ProcessDataTag(XmlReader xmlTextReader, LogEntry entry)
 {
     switch (xmlTextReader.GetAttribute("name"))
     {
         case ("log4net:UserName"):
             entry.UserName = xmlTextReader.GetAttribute("value");
             break;
         case ("log4japp"):
             entry.App = xmlTextReader.GetAttribute("value");
             break;
         case ("log4jmachinename"):
             entry.MachineName = xmlTextReader.GetAttribute("value");
             break;
         case ("log4net:HostName"):
             entry.HostName = xmlTextReader.GetAttribute("value");
             break;
     }
 }
 private static void SetLocationInfo(LogEntry entry, XmlReader xmlTextReader)
 {
     entry.Class = xmlTextReader.GetAttribute("class");
     entry.Method = xmlTextReader.GetAttribute("method");
     entry.File = xmlTextReader.GetAttribute("file");
     entry.Line = xmlTextReader.GetAttribute("line");
 }
        private static IEnumerable<LogEntry> ProcessLogEntry(XmlReader xmlTextReader, string logFile, DateTime date)
        {
            DateTime? prevTimeStamp = null;
            while (xmlTextReader.Read())
            {
                if ((xmlTextReader.NodeType != XmlNodeType.Element) || (xmlTextReader.Name != "log4j:event"))
                    continue;

                var entry = new LogEntry();
                entry.Path = logFile;
                entry.Logger = xmlTextReader.GetAttribute("logger");
                entry.TimeStamp = date.AddMilliseconds(Convert.ToDouble(xmlTextReader.GetAttribute("timestamp"))).ToLocalTime();

                if (prevTimeStamp.HasValue)
                    entry.Delta = (entry.TimeStamp - prevTimeStamp.Value).TotalSeconds;
                prevTimeStamp = entry.TimeStamp;

                var severityLevel = xmlTextReader.GetAttribute("level");
                entry.SeverityLevel = severityLevel;
                entry.Thread = xmlTextReader.GetAttribute("thread");

                ProcessChildNodes(xmlTextReader, entry);
                yield return entry;
            }
        }