Random photo
Loading...
Domains for sale
|
July 22, 2003Log file in XML format?Pros: trivial writing/parsing, portability, readability, simplicity. Constras: everybody seems to think it's unfeasible due to XML well-formedness and hence root element end tag problem - to append records you need to seek an appropriate place hence to parse the whole XML document. That's true for XML documents, but what about XML fragment? XML fragment is actually external general parsed entity in XML 1.0 specification terms - it's freestanding fragment of XML, which can be incorporated into an XML document by entity reference, but it's still useful on its own - one can append elements to it (and because it's not XML document, root-level well-formedness rules don't apply to it, so one can just append elements to the end of file, without necessity to parse the whole log file) and then read such log file by XmlTextReader, which [thankfully to .NET developers] supports XML fragments (see "Reading XML Fragments with the XmlTextReader"). So here is small proof-of-concept example: Writing to log:
class Test {
static void Main(string[] args) {
using (FileStream fs = File.Open("log.xml",
FileMode.Append, FileAccess.Write, FileShare.Read)) {
XmlTextWriter writer = new XmlTextWriter(fs, Encoding.ASCII);
for (int i=0; i<3; i++) {
writer.WriteElementString("item", "",
DateTime.Now.ToString());
writer.WriteWhitespace("\n");
}
writer.Close();
}
}
}
First run creates log.xml:
<item>7/22/2003 11:15:42 AM</item> <item>7/22/2003 11:15:42 AM</item> <item>7/22/2003 11:15:42 AM</item>Second run appends three more items: <item>7/22/2003 11:15:42 AM</item> <item>7/22/2003 11:15:42 AM</item> <item>7/22/2003 11:15:42 AM</item> <item>7/22/2003 11:16:12 AM</item> <item>7/22/2003 11:16:12 AM</item> <item>7/22/2003 11:16:12 AM</item>Reading log:
class Test {
static void Main(string[] args) {
using (FileStream fs = File.OpenRead("log.xml")) {
XmlParserContext context = new XmlParserContext(
new NameTable(), null, null, XmlSpace.Default);
XmlTextReader reader = new XmlTextReader(fs,
XmlNodeType.Element, context);
while (reader.Read()) {
if (reader.NodeType == XmlNodeType.Element) {
Console.WriteLine("Element: {0}, Value: {1}",
reader.Name, reader.ReadElementString());
}
}
}
}
}
And result is:
D:\projects\Test2\bin\Debug>Test2.exe Element: item, Value: 7/22/2003 11:15:42 AM Element: item, Value: 7/22/2003 11:15:42 AM Element: item, Value: 7/22/2003 11:15:42 AM Element: item, Value: 7/22/2003 11:16:12 AM Element: item, Value: 7/22/2003 11:16:12 AM Element: item, Value: 7/22/2003 11:16:12 AMI like it. Comments?
Doing web page
design on your own can be as successful as your
web site design coming from a professional
web designer but you'll want to make sure that your
web site design is user-friendly and clean before worrying about bells and
whistles.
July 22, 2003 1:46 PM
| #XML
Comments
Sounds interesting. Any URL? Posted by: Oleg Tkachenko at August 3, 2003 11:43 AMWe went a little bit further with that approach by adding ability to emit hierarchical logs (e.g. logging specific operations in scope of parent operations etc.). This enabled some interesting ways of analyzing those hierarchical logs. Posted by: Peter Hizalev at August 2, 2003 4:12 AMPost a comment
Listed below are links to weblogs that reference this post:
Reading XML fragments with XmlTextReader from kzu.net
Reading XML fragments with XmlTextReader from kzu.net
Mvp.Xml project: Reading XML fragments with XmlTextReader - XmlFragmentStream from
Reading XML fragments with XmlTextReader - XmlFragmentStream from
RE: Appending XML files and confusing disposables from J e r o e n ' s
Reading XML fragments with XmlTextReader - XmlFragmentStream from
New Microsoft XML API - XmlLite from Signs on the Sand |