<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Instrumentation/Logging</title>
        <link>http://geekswithblogs.net/rashid/category/6040.aspx</link>
        <description>Instrumentation/Logging</description>
        <language>en-US</language>
        <copyright>Kazi Manzur Rashid</copyright>
        <managingEditor>kazimanzurrashid@gmail.com</managingEditor>
        <generator>Subtext Version 0.0.0.0</generator>
        <item>
            <title>My New Article - Effective Error Logging in Asp.net Ajax</title>
            <link>http://geekswithblogs.net/rashid/archive/2007/08/13/My-New-Article---Effective-Error-Logging-in-Asp.net-Ajax.aspx</link>
            <description>&lt;p&gt;My latest article &lt;a href="http://dotnetslackers.com/columns/ajax/AspNetAjaxExceptionLogging.aspx" target="_blank"&gt;Asp.net Ajax Error Logging&lt;/a&gt; has been just published in &lt;a href="http://dotnetslackers.com" target="_blank"&gt;DotNetSlackers.com&lt;/a&gt;. In this article, I have demonstrate how to extend Asp.net Ajax Framework to create an effective error logging system which support multiple trace listeners like Enterprise Library. A must read if you are developing or planning to develop an Asp.net Ajax Web Application. You will also find my name in the &lt;a href="http://dotnetslackers.com/columns/ajax/" target="_blank"&gt;Ajax Columns in DotNetSlackers.com&lt;/a&gt; as I have planned to write at least one, preferably two articles each month. If you have any comment on my new article or you have any specific topic which you think I should cover, please do send me your feedback.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://dotnetslackers.com/columns/ajax/AspNetAjaxExceptionLogging.aspx" target="_blank"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://dotnetslackers.com/columns/ajax/AspNetAjaxExceptionLogging.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114593"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=114593" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/rashid/aggbug/114593.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Kazi Manzur Rashid</dc:creator>
            <guid>http://geekswithblogs.net/rashid/archive/2007/08/13/My-New-Article---Effective-Error-Logging-in-Asp.net-Ajax.aspx</guid>
            <pubDate>Sun, 12 Aug 2007 18:09:37 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/rashid/comments/114593.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/rashid/archive/2007/08/13/My-New-Article---Effective-Error-Logging-in-Asp.net-Ajax.aspx#feedback</comments>
            <wfw:commentRss>http://geekswithblogs.net/rashid/comments/commentRss/114593.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/rashid/services/trackbacks/114593.aspx</trackback:ping>
        </item>
        <item>
            <title>Performance Benchmark with an Handy Class</title>
            <link>http://geekswithblogs.net/rashid/archive/2007/06/21/Performance-Benchmark-with-an-Handy-Class.aspx</link>
            <description>&lt;p&gt;Instrumentation and Logging is an essential part of Software Development. Generally, most of the developer thinks instrumentation and logging is all about exception logging in a text file, which is not correct at all. Certainly, exception takes a major part in the instrumentation and logging. However, how many of us really bother the way the log data is written, do we really bother to import this data in a software to further analysis? In the following, I will present a handy class, which will automatically benchmark the instrumented method, so that we can do further analysis on the overall performance of our application. &lt;/p&gt; &lt;p&gt;PerformanceLog.cs:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Reflection;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Diagnostics;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Globalization;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;sealed&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PerformanceLog : IDisposable&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _isPerformancelogEnabled = Convert.ToBoolean(ConfigurationManager.AppSettings[&lt;span class="str"&gt;"performanceLogEnabled"&lt;/span&gt;]);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _logFile = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings[&lt;span class="str"&gt;"performanceLogFile"&lt;/span&gt;];&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _includeParameters = Convert.ToBoolean(ConfigurationManager.AppSettings[&lt;span class="str"&gt;"performanceLogIncludeParameters"&lt;/span&gt;]);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Stopwatch _watch;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; PerformanceLog()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_isPerformancelogEnabled)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            _watch = &lt;span class="kwrd"&gt;new&lt;/span&gt; Stopwatch();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            _watch.Start();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_isPerformancelogEnabled)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;            _watch.Stop();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            DateTime end = DateTime.Now;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;            DateTime start = end.AddMilliseconds(-_watch.ElapsedMilliseconds);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; userName = System.Web.HttpContext.Current.User.Identity.Name;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; methodInfo = GetCallingMethodDetails(_includeParameters);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (FileStream fs = &lt;span class="kwrd"&gt;new&lt;/span&gt; FileStream(_logFile, FileMode.Append, FileAccess.Write, FileShare.None))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;                &lt;span class="kwrd"&gt;using&lt;/span&gt; (StreamWriter sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; StreamWriter(fs, Encoding.ASCII))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                    sw.Write(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\"\n"&lt;/span&gt;, userName, methodInfo, start, end, _watch.Elapsed));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetCallingMethodDetails(&lt;span class="kwrd"&gt;bool&lt;/span&gt; includeParameters)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;        StringBuilder output = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        &lt;span class="rem"&gt;//Skipping two Frame, First one is the current method and second one is the dispose method.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;        StackTrace stackTrace = &lt;span class="kwrd"&gt;new&lt;/span&gt; StackTrace(2, &lt;span class="kwrd"&gt;false&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        StackFrame stackFrame = stackTrace.GetFrame(0);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;        MethodBase method = stackFrame.GetMethod();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        output.Append(method.Name);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;        output.Append(&lt;span class="str"&gt;"("&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (includeParameters)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;            ParameterInfo[] paramInfos = method.GetParameters();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ((paramInfos != &lt;span class="kwrd"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (paramInfos.Length &amp;gt; 0))&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;                output.Append(paramInfos[0].ParameterType.ToString());&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;                output.Append(&lt;span class="str"&gt;" "&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;                output.Append(paramInfos[0].Name);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (paramInfos.Length &amp;gt; 1)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;                {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; j = 1; j &amp;lt; paramInfos.Length; j++)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;                    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;                        output.AppendFormat(&lt;span class="str"&gt;", {0} {1}"&lt;/span&gt;, paramInfos[j].ParameterType.ToString(), paramInfos[j].Name);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;                    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;                }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;        output.Append(&lt;span class="str"&gt;")"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; output.ToString();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;Category&amp;gt; GetAllCategory()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (PerformanceLog log = &lt;span class="kwrd"&gt;new&lt;/span&gt; PerformanceLog())&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="rem"&gt;//Do your Processing over here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Web/App.config:&lt;/p&gt;&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="performanceLogEnabled"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="performanceLogFile"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="PerformanceLog.csv"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;key&lt;/span&gt;&lt;span class="kwrd"&gt;="performanceLogIncludeParameters"&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="false"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;appSettings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Logging Data:&lt;/p&gt;&lt;pre&gt;"Amit-Dell\Kazi Manzur Rashid","GetAllCategory()","6/21/2007 11:26:06 PM","6/21/2007 11:26:08 PM","00:00:02.0282049"
"Amit-Dell\Kazi Manzur Rashid","GetProductList()","6/21/2007 11:26:08 PM","6/21/2007 11:26:09 PM","00:00:00.7225937"
"Amit-Dell\Kazi Manzur Rashid","GetProductList()","6/21/2007 11:26:12 PM","6/21/2007 11:26:12 PM","00:00:00.0400289"
"Amit-Dell\Kazi Manzur Rashid","GetProductList()","6/21/2007 11:26:43 PM","6/21/2007 11:26:43 PM","00:00:00.0012069"
"Amit-Dell\Kazi Manzur Rashid","GetProductList()","6/21/2007 11:26:43 PM","6/21/2007 11:26:44 PM","00:00:00.0463002"
"Amit-Dell\Kazi Manzur Rashid","GetCustomerList()","6/21/2007 11:26:49 PM","6/21/2007 11:26:49 PM","00:00:00.0952376"
"Amit-Dell\Kazi Manzur Rashid","GetAllSupplier()","6/21/2007 11:28:33 PM","6/21/2007 11:28:33 PM","00:00:00.0364298"
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;As you can see the class is simply dumping the User Name, The instrumented method(The Parameters info can be turned on from the web.config), start and end time of the method and the total elapsed time of the method in a csv format. The benefit of generating in csv format is we can easily import these data in Microsoft Excel to take full advantage of Excel such as finding the Longest and shortest call, Average call, Number of Average call of a User, Graph etc.&lt;/p&gt;
&lt;p&gt;The simplicity of the class is, we do not have to do anything fancy except creating an instance of the class. The class is responsible to discover the method name and its parameter, start/end/elapsed time, user name etc. &lt;/p&gt;
&lt;p&gt;In Pageflakes, we are doing the same but in a different twist, we are utilizing the &lt;a href="http://www.codeplex.com/EntLib" target="_blank"&gt;Enterprise Library&lt;/a&gt; (logging and Instrumentation Block) to generate this. If you are interested to see how the EntLib can be used to do the above let me know. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download&lt;/strong&gt;: &lt;a href="http://www.box.net/shared/a0oycfapok" target="_blank"&gt;PerformanceLog.cs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://www.dotnetkicks.com/kick/?http://geekswithblogs.net/rashid/archive/2007/06/21/Performance-Benchmark-with-an-Handy-Class.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://geekswithblogs.net/rashid/archive/2007/06/21/Performance-Benchmark-with-an-Handy-Class.aspx" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.pheedo.com/click.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=113369"&gt;&lt;img src="http://www.pheedo.com/img.phdo?x=6cda6ad746d942b9a1110d0715a4fa12&amp;u=113369" border="0"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;iframe src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;PageID=31016&amp;amp;SiteID=1" width=1 height=1 Marginwidth=0 Marginheight=0 Hspace=0 Vspace=0 Frameborder=0 Scrolling=No&gt;
&lt;script language='javascript1.1' src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Browser=NETSCAPE4&amp;amp;NoCache=True&amp;PageID=31016&amp;amp;SiteID=1"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;a href="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Click&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" target="_blank"&gt;
&lt;img src="http://ads.geekswithblogs.net/a.aspx?ZoneID=5&amp;amp;Task=Get&amp;amp;Mode=HTML&amp;amp;SiteID=1&amp;amp;PageID=31016" width="1" height="1" border="0"  alt=""&gt;&lt;/a&gt;
&lt;/noscript&gt;
&lt;/iframe&gt;
&lt;img src="http://geekswithblogs.net/rashid/aggbug/113369.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Kazi Manzur Rashid</dc:creator>
            <guid>http://geekswithblogs.net/rashid/archive/2007/06/21/Performance-Benchmark-with-an-Handy-Class.aspx</guid>
            <pubDate>Thu, 21 Jun 2007 17:47:30 GMT</pubDate>
            <wfw:comment>http://geekswithblogs.net/rashid/comments/113369.aspx</wfw:comment>
            <comments>http://geekswithblogs.net/rashid/archive/2007/06/21/Performance-Benchmark-with-an-Handy-Class.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://geekswithblogs.net/rashid/comments/commentRss/113369.aspx</wfw:commentRss>
            <trackback:ping>http://geekswithblogs.net/rashid/services/trackbacks/113369.aspx</trackback:ping>
        </item>
    </channel>
</rss>