Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

log4net NonBufferedSmtpAppenderWithSubjectLayout

0.00/5 (No votes)
10 Nov 2006 1  
NonBufferedSmtpAppenderWithSubjectLayout is an appender for the log4net logging framework. The mails it sends are non buffered (1 log message = 1 mail) and the subject of the mail can be customized with a layout

Sample Image - outlook.jpg

Introduction

For those who don't know log4net, here is a great article about it. One problem that I have with the SmtpAppender is that it sends a lot of log messages in bulk (it buffers default 250 messages and then sends them in 1 mail). It also doesn't allow you to generate the subject of the mail based on the log message. So I decided to write a modified SmtpAppender that sends it mails non buffered (so 1 log message = 1 mail) and generates the subject based on the log message.

log4net Configuration

Look at the conversion pattern in the subject, it uses a layout to be dynamically generated. <--> The default SmtpAppender's subject is static.

<appender name="smtp" 
  type="HHR.log4net.Appender.NonBufferedSmtpAppenderWithSubjectLayout, 
                                HHR.log4net">
 <to value="myname@mycompany.com" />
 <from value="HHR.log4net.Tests@mycompany.com" />
 <subject type="HHR.log4net.Layout.PatternLayout, HHR.log4net">
  <conversionPattern value="%date %level %exceptType at [%logger] 
                            on %property{log4net:HostName} by %username" />
 </subject>
 <smtpHost value="smtp.mycompany.com" />
 <layout type="log4net.Layout.PatternLayout, log4net">
  <conversionPattern value="%date [%thread] %-5level %logger 
                            [%ndc] &lt;%property{user}&gt; - 
                            %message%newline" />
 </layout>
 <filter type="log4net.Filter.LevelRangeFilter">
  <levelMin value="WARN" />
  <levelMax value="FATAL" />
 </filter>   
</appender>

Code

I modified the Subject property from a string to a ILayout.

//I can use a layout for my subject!!!!!!!!!!!!


public ILayout Subject 
{
   get { return m_subject; }
   set { m_subject = value; }
}

I also modified the base class of the Appender from BufferingAppenderSkeleton to AppenderSkeleton. I added an ExceptionTypePatternConverter class that is derived from the PatternLayoutConverter class so that I can use the %exceptType pattern that just returns the class name of the thrown exception.

Conclusion

This looks like a more useful version of the SmtpAppender than the one inside log4net. I included a NUnit test case to play around with. Just modify the 'smtpHost' and the 'to' values in the App.config and off you go.

History

Updated 2006/13/10

  • Added own PatternLayout with %exceptType pattern!
  • Added log4net configuration samples for some other appenders like AdoNetAppender, TraceAppender, ConsoleAppender, RollingFileAppender and EventLogAppender

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here