views:

458

answers:

1

Is it possible to use the Enterprise Library 4.1 TraceListeners without using the entire Enterprise Library Logging AB? I'd prefer to simply use .NET Diagnostics Tracing, but would like to setup a listener that sends emails on Error events. I figured I could use the Enterprise Library EmailTraceListener. However, my initial attempts to configure it have failed. Here's what I hoped would work:

<system.diagnostics>
  <trace autoflush="false" />
  <sources>
    <source name="SampleSource" switchValue="Verbose" >
      <listeners>
        <add name="textFileListener" />
        <add name="emailListener" />
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="textFileListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="..\trace.log" traceOutputOptions="DateTime">
      <filter type="System.Diagnostics.EventTypeFilter" initializeData="Verbose" />
    </add>
    <add name="emailListener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging" toAddress="[email protected]" fromAddress="[email protected]" smtpServer="mail.example.com" >
      <filter type="System.Diagnostics.EventTypeFilter" initializeData="Verbose" />
    </add>
  </sharedListeners>
</system.diagnostics>

However I get

[ArgumentException: The parameter 'address' cannot be an empty string.
Parameter name: address]
   System.Net.Mail.MailAddress..ctor(String address, String displayName, Encoding displayNameEncoding) +1098157
   System.Net.Mail.MailAddress..ctor(String address) +8
   Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.EmailMessage.CreateMailMessage() +256
   Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.EmailMessage.Send() +39
   Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener.Write(String message) +96
   System.Diagnostics.TraceListener.WriteHeader(String source, TraceEventType eventType, Int32 id) +184
   System.Diagnostics.TraceListener.TraceEvent(TraceEventCache eventCache, String source, TraceEventType eventType, Int32 id, String format, Object[] args) +63
   System.Diagnostics.TraceSource.TraceEvent(TraceEventType eventType, Int32 id, String format, Object[] args) +198
   System.Diagnostics.TraceSource.TraceInformation(String message) +14

Which leads me to believe the .NET Tracing code does not care about the "non-standard" config attributes I've supplied for emailListener. I also tried adding the appropriate LAB configSection declaration and:

<loggingConfiguration>
  <listeners>
    <add toAddress="[email protected]" fromAddress="[email protected]" smtpServer="mail.example.com" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging" name="emailListener" />
  </listeners>
</loggingConfiguration>

This also results in the same exception. I figure it's possible to programmatically configure the EmailTraceListener, but I prefer this to be config-driven. I also understand I can implement my own derivative of TraceListener.

So, is it possible to use the Ent Lib TraceListeners, without using the whole Ent Lib LAB, and configure them from the config file?

Update: After examining the code, I have discovered it is not possible. The Ent Lib TraceListeners do not actually utilize the config attributes they specify in overriding TraceListener.GetSupportedAttributes(), despite the recommendations in the .NET TraceListener documentation. Bug filed.

+2  A: 

For this specific purpose, I have used the lightweight UKADC.Diagnostics library in several projects now. It gets you an easy to use SMTPTraceListener and a SQLTraceListener for free.

http://ukadcdiagnostics.codeplex.com/wikipage?title=SmtpTraceListener&amp;referringTitle=Home

DickB
Very cool, I'll look into this. Thank you.
gWiz
Yes, I definitely like that this library aims to leverage the System.Diagnostics stuff in the framework. Sweet.
gWiz