<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>IIrrelevant - Logging</title>
    <link>http://www.milkcarton.com/blog/</link>
    <description>Irrelevant musings about software development</description>
    <language>en-us</language>
    <copyright>Dan Morphis</copyright>
    <lastBuildDate>Sat, 21 Feb 2009 07:18:15 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>blog@milkcarton.com</managingEditor>
    <webMaster>blog@milkcarton.com</webMaster>
    <item>
      <trackback:ping>http://www.milkcarton.com/blog/Trackback.aspx?guid=8396d43e-d21d-44fd-b279-b9e8940a3304</trackback:ping>
      <pingback:server>http://www.milkcarton.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.milkcarton.com/blog/PermaLink,guid,8396d43e-d21d-44fd-b279-b9e8940a3304.aspx</pingback:target>
      <dc:creator>Dan Morphis</dc:creator>
      <wfw:comment>http://www.milkcarton.com/blog/CommentView,guid,8396d43e-d21d-44fd-b279-b9e8940a3304.aspx</wfw:comment>
      <wfw:commentRss>http://www.milkcarton.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=8396d43e-d21d-44fd-b279-b9e8940a3304</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of our applications has a Windows service in it. To make debugging and running
this service easy,we have a winform in the service which can be activated by passing
a command line switch. Simple enough. Our service does all its logging with log4net.
I wanted to be able to put the output of the logging on our development form, but
how?
</p>
        <p>
After looking at various things, I realized what I needed to do was create a log4net
appender, and add the appender to the log4net logger and at regular intervals, grab
the contents of the logger.
</p>
        <h3>Solution
</h3>
        <p>
I created the below appender which uses a StringBuilder as the backing store. It takes
in one bool param in the contructor which allows you to specify if you want the log
to be built up in reverse.  This is useful if you want to display the most recent
event at the top.
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <span style="color: #0000ff">public</span>
            <span style="color: #0000ff">class</span> StringBuilderAppender
: log4net.Appender.AppenderSkeleton { <span style="color: #0000ff">private</span> System.Text.StringBuilder
_builder = <span style="color: #0000ff">new</span> System.Text.StringBuilder(); <span style="color: #0000ff">private</span><span style="color: #0000ff">readonly</span><span style="color: #0000ff">bool</span> _invert; <span style="color: #0000ff">public</span> StringBuilderAppender(<span style="color: #0000ff">bool</span> invert)
{ _invert = invert; } <span style="color: #0000ff">public</span><span style="color: #0000ff">string</span> Text
{ get { <span style="color: #0000ff">return</span> _builder.ToString(); } } <span style="color: #0000ff">protected</span><span style="color: #0000ff">override</span><span style="color: #0000ff">void</span> Append(log4net.Core.LoggingEvent
loggingEvent) { var msg = loggingEvent.RenderedMessage; <span style="color: #0000ff">if</span> (_invert)
_builder = <span style="color: #0000ff">new</span> System.Text.StringBuilder().AppendLine(msg).Append(_builder); <span style="color: #0000ff">else</span> _builder.AppendLine(msg);
} }</pre>
        </div>
        <p>
Now we need to add our new appender to the logger. I found this helper method someone
wrote.
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">
            <span style="color: #0000ff">public</span>
            <span style="color: #0000ff">static</span>
            <span style="color: #0000ff">void</span> AddAppender(<span style="color: #0000ff">string</span> loggerName,
IAppender appender) { log4net.ILog log = log4net.LogManager.GetLogger(loggerName);
log4net.Repository.Hierarchy.Logger l = (log4net.Repository.Hierarchy.Logger)log.Logger;
l.AddAppender(appender); }</pre>
        </div>
        <p>
Finally, lets put it all together:
</p>
        <div>
          <pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">StringBuilderAppender appender = <span style="color: #0000ff">new</span> StringBuilderAppender(<span style="color: #0000ff">true</span>);
AddAppender(<span style="color: #006080">"MyLogger"</span>, appender); <span style="color: #0000ff">while</span>(<span style="color: #0000ff">true</span>)
{ System.Threading.Thread.Sleep(5000); someControl.Text = appender.Text; }</pre>
        </div>
        <img width="0" height="0" src="http://www.milkcarton.com/blog/aggbug.ashx?id=8396d43e-d21d-44fd-b279-b9e8940a3304" />
      </body>
      <title>Building a log4net appender</title>
      <guid isPermaLink="false">http://www.milkcarton.com/blog/PermaLink,guid,8396d43e-d21d-44fd-b279-b9e8940a3304.aspx</guid>
      <link>http://www.milkcarton.com/blog/2009/02/21/Building+A+Log4net+Appender.aspx</link>
      <pubDate>Sat, 21 Feb 2009 07:18:15 GMT</pubDate>
      <description>&lt;p&gt;
One of our applications has a Windows service in it. To make debugging and running
this service easy,we have a winform in the service which can be activated by passing
a command line switch. Simple enough. Our service does all its logging with log4net.
I wanted to be able to put the output of the logging on our development form, but
how?
&lt;/p&gt;
&lt;p&gt;
After looking at various things, I realized what I needed to do was create a log4net
appender, and add the appender to the log4net logger and at regular intervals, grab
the contents of the logger.
&lt;/p&gt;
&lt;h3&gt;Solution
&lt;/h3&gt;
&lt;p&gt;
I created the below appender which uses a StringBuilder as the backing store. It takes
in one bool param in the contructor which allows you to specify if you want the log
to be built up in reverse.&amp;nbsp; This is useful if you want to display the most recent
event at the top.
&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; StringBuilderAppender
: log4net.Appender.AppenderSkeleton { &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; System.Text.StringBuilder
_builder = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Text.StringBuilder(); &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; _invert; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; StringBuilderAppender(&lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; invert)
{ _invert = invert; } &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Text
{ get { &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; _builder.ToString(); } } &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Append(log4net.Core.LoggingEvent
loggingEvent) { var msg = loggingEvent.RenderedMessage; &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (_invert)
_builder = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; System.Text.StringBuilder().AppendLine(msg).Append(_builder); &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; _builder.AppendLine(msg);
} }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Now we need to add our new appender to the logger. I found this helper method someone
wrote.
&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; AddAppender(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; loggerName,
IAppender appender) { log4net.ILog log = log4net.LogManager.GetLogger(loggerName);
log4net.Repository.Hierarchy.Logger l = (log4net.Repository.Hierarchy.Logger)log.Logger;
l.AddAppender(appender); }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Finally, lets put it all together:
&lt;/p&gt;
&lt;div&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;StringBuilderAppender appender = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringBuilderAppender(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);
AddAppender(&lt;span style="color: #006080"&gt;"MyLogger"&lt;/span&gt;, appender); &lt;span style="color: #0000ff"&gt;while&lt;/span&gt;(&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;)
{ System.Threading.Thread.Sleep(5000); someControl.Text = appender.Text; }&lt;/pre&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://www.milkcarton.com/blog/aggbug.ashx?id=8396d43e-d21d-44fd-b279-b9e8940a3304" /&gt;</description>
      <comments>http://www.milkcarton.com/blog/CommentView,guid,8396d43e-d21d-44fd-b279-b9e8940a3304.aspx</comments>
      <category>.NET</category>
      <category>HowTo</category>
      <category>Logging</category>
    </item>
  </channel>
</rss>