ASP.NET Weblogs

Li Chen's Blog

SkyLog: My first end-to-end example on programming by composition

I have completed my first end-to-end example as I am exploring the idea of programming by composition. SkyLog is an example on querying IIS Log files like what LogParser do, except:

  1. It is built on LINQ and thus can use the entire .net framework, not just the built-in functions of LogParser.
  2. It can use Parallel LINQ and thus uses multiple cores effectively.
  3. Any part of a query can be refactored into a function and thus reused.
  4. We just need to write the queries once and the queries can be used against one log file, a whole directory of log files, several servers, and in any storage, such as Azure Blog Storage.

The running example are available at The example runs the query against some log files stored in Azure Blog Storage.


The queries in the example are from

The queries look even simpler than what you normally write against LogParser or SQL Server:


That is because part of the queries were refactored into two reusable functions below. We cannot reuse part of query with LogParser. With SQL Server, we can create reusable units with View. With LINQ, we can reuse any part of the LINQ query.


Note that I used the memory efficient version of GroupBy written by me previously. The equivalent code using the GroupBy in LINQ is commented out.

To run these reports, we just need records from the log files as IEnumerable<string>. To get them from a directory, the code would look like:


To get records from Windows Azure Blob Storage, the could would look like:


Lastly, we need to convert IEnumberable<string> to strongly-typed wrapper, IEnumerable<W3SVCLogRecord>, to be consumed by the reports:


I touched upon the idea of strongly-typed wrapper previously. The purpose of strongly-typed wrapper is to allow intelligence while minimize the garbage collection. The wrapper provides access to underlying data, but does not convert the data to a data-transfer-object.

The front-end is a simple ASP.NET MVC page. Reports are exposed through ASP.NET Web API using the CSV formatter that I built previously. The visualization was built using D3.js. The code is so simple that we could think each line of the code as Javascript based widgets. If we desire more sophisticated UI, we could compose the UI with a different widget. We could even introduce a client-side template engine such as Mustache.js.


Even with simple example, there are enough benefits in it so that I probably would never need to use LogParser again. The example is fully built on LINQ to IEnumerable. I have not used any cool feature from IQueryable and Rx yet. As usually, the latest code is in Stay tuned for more fun stuff.



chandra said:

Awesome work...

January 6, 2014 10:48 PM

Leave a Comment