public IEnumerable<LogEntry> Parse(Stream s)
{
var nt = new NameTable ();
var nsmgr = new XmlNamespaceManager (nt);
nsmgr.AddNamespace ("log4j", "http://jakarta.apache.org/log4j/");
nsmgr.AddNamespace ("log4net", "http://logging.apache.org/log4net/");
// Create the XmlParserContext.
var context = new XmlParserContext (null, nsmgr, null, XmlSpace.None);
// Create the reader.
var settings = new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Fragment,
CheckCharacters = false,
XmlResolver = null,
DtdProcessing = DtdProcessing.Ignore
};
var list = new List<LogEntry> ();
var encoding = Encoding.UTF8;
var xmlreader = XmlReader.Create (new StreamReader (s, encoding), settings, context);
Names names = new Names{
@event = xmlreader.NameTable.Add ("event"),
message = xmlreader.NameTable.Add ("message"),
properties = xmlreader.NameTable.Add ("properties"),
data = xmlreader.NameTable.Add ("data"),
ndc = xmlreader.NameTable.Add("NDC"),
name = xmlreader.NameTable.Add ("name"),
@value = xmlreader.NameTable.Add ("value"),
throwable = xmlreader.NameTable.Add ("throwable"),
exception = xmlreader.NameTable.Add ("exception"),
timestamp = xmlreader.NameTable.Add ("timestamp"),
thread = xmlreader.NameTable.Add ("thread"),
domain = xmlreader.NameTable.Add ("domain"),
level = xmlreader.NameTable.Add ("level"),
logger = xmlreader.NameTable.Add ("logger"),
locationinfo = xmlreader.NameTable.Add ("locationInfo"),
@class = xmlreader.NameTable.Add ("class"),
method = xmlreader.NameTable.Add ("method"),
file = xmlreader.NameTable.Add ("file"),
line = xmlreader.NameTable.Add ("line"),
username = xmlreader.NameTable.Add ("username")};
while (xmlreader.Read()) {
switch (xmlreader.NodeType) {
case XmlNodeType.Whitespace:
break;
case XmlNodeType.Element:
if (Object.ReferenceEquals (xmlreader.LocalName, names.@event)) {
LogEntry logentry = null;
logentry = new LogEntry ();
if (xmlreader.HasAttributes) {
while (xmlreader.MoveToNextAttribute()) {
if (Object.ReferenceEquals (xmlreader.LocalName, names.timestamp)) {
var timestamp = xmlreader.Value;
if (!string.IsNullOrEmpty (timestamp)) {
double dSeconds;
logentry.Data.TimeStamp = Double.TryParse (timestamp, out dSeconds)
? _dt.AddMilliseconds (dSeconds).ToLocalTime ()
: DateTime.Parse (timestamp).ToLocalTime ();
}
} else if (Object.ReferenceEquals (xmlreader.LocalName, names.thread))
{
logentry.Data.ThreadName = xmlreader.Value;
}
else if (Object.ReferenceEquals (xmlreader.LocalName, names.domain))
{
logentry.Data.Domain = xmlreader.Value;
}
else if (Object.ReferenceEquals (xmlreader.LocalName, names.level)) {
logentry.Data.Level = LogEntry.GetLevel(xmlreader.Value);
logentry.Image = LogEntryParser.ParseImageType (logentry.Data.Level.Name);
} else if (Object.ReferenceEquals (xmlreader.LocalName, names.logger))
{
logentry.Data.LoggerName = xmlreader.Value;
}
else if (Object.ReferenceEquals (xmlreader.LocalName, names.username))
{
logentry.Data.UserName = xmlreader.Value;
}
else {
throw new NotImplementedException (xmlreader.LocalName);
}
}
xmlreader.MoveToElement ();
}
EventChildren (xmlreader, names, logentry);
list.Add (logentry);
} else {
Console.WriteLine (xmlreader.NodeType + ", " + xmlreader.Name + ": " + xmlreader.Value);
throw new NotImplementedException ();
}
break;
default:
Console.WriteLine (xmlreader.NodeType + ", " + xmlreader.Name + ": " + xmlreader.Value);
throw new NotImplementedException (xmlreader.NodeType.ToString ());
}
}
return list;
}