轻量使用Enterprise Library TraceListeners

时间:2009-12-11 22:46:15

标签: .net logging enterprise-library

是否可以在不使用整个Enterprise Library Logging AB的情况下使用Enterprise Library 4.1 TraceListeners?我更喜欢简单地使用.NET诊断跟踪,但是想设置一个在Error事件上发送电子邮件的监听器。我想我可以使用企业库EmailTraceListener。但是,我最初尝试配置它失败了。这是我希望的工作:

<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="to@example.com" fromAddress="from@example.com" smtpServer="mail.example.com" >
      <filter type="System.Diagnostics.EventTypeFilter" initializeData="Verbose" />
    </add>
  </sharedListeners>
</system.diagnostics>

但是我得到了

[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

这让我相信.NET跟踪代码并不关心我为emailListener提供的“非标准”配置属性。我还尝试添加适当的LAB configSection声明和:

<loggingConfiguration>
  <listeners>
    <add toAddress="to@example.com" fromAddress="from@example.com" smtpServer="mail.example.com" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging" name="emailListener" />
  </listeners>
</loggingConfiguration>

这也导致了同样的例外。我认为可以通过编程方式配置EmailTraceListener,但我更喜欢这是配置驱动的。我也明白我可以实现自己的TraceListener派生。

那么,是否可以使用Ent Lib TraceListeners而不使用整个Ent Lib LAB,并从配置文件中配置它们?

更新:检查完代码后,我发现这是不可能的。尽管.NET TraceListener文档中提出了建议,但Ent Lib TraceListeners实际上并未使用它们在重写TraceListener.GetSupportedAttributes()时指定的配置属性。 Bug已提交。

1 个答案:

答案 0 :(得分:3)

出于这个特定目的,我现在在几个项目中使用了轻量级UKADC.Diagnostics库。 它为您提供了一个易于使用的SMTPTraceListener和一个免费的SQLTraceListener。

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