65.9K
CodeProject is changing. Read more.
Home

log4net NonBufferedSmtpAppenderWithSubjectLayout

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.56/5 (3 votes)

Aug 25, 2006

Apache

1 min read

viewsIcon

48103

downloadIcon

777

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