Можно ли использовать TraceListeners Enterprise Library 4.1 без использования всего AB Enterprise Library Logging? Я бы предпочел просто использовать трассировку диагностики .NET, но хотел бы настроить прослушиватель, который отправляет электронные письма при возникновении ошибок. Я подумал, что могу использовать EmailTraceListener Enterprise Library. Однако мои первые попытки настроить его не увенчались успехом. Вот что, как я надеялся, сработает:
<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>
Однако я получаю
[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="[email protected]" fromAddress="[email protected]" 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, и настраивать их из файла конфигурации?
Обновление: изучив код, я обнаружил, что это невозможно. Ent Lib TraceListeners на самом деле не используют атрибуты конфигурации, которые они указывают в переопределении TraceListener.GetSupportedAttributes(), несмотря на рекомендации в документации .NET TraceListener. Ошибка зарегистрирована.