C# 为什么电子邮件跟踪侦听器阻止其他侦听器工作?

C# 为什么电子邮件跟踪侦听器阻止其他侦听器工作?,c#,logging,enterprise-library,C#,Logging,Enterprise Library,我们使用企业库应用程序块6来实现日志记录。我们有两个跟踪侦听器,一个用于登录数据库,另一个用于发送电子邮件警报。它们的配置如下所示: <loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="MyProject" logWarningsWhenNoCategoriesMatch="true"> <listeners> &

我们使用企业库应用程序块6来实现日志记录。我们有两个跟踪侦听器,一个用于登录数据库,另一个用于发送电子邮件警报。它们的配置如下所示:

<loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="MyProject" logWarningsWhenNoCategoriesMatch="true">
    <listeners>
        <add name="Database Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging.Database" ... />
        <add name="Email Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ... />
    </listeners>
    <categorySources>
        <add switchValue="All" name="MyProject">
            <listeners>
                <add name="Email Trace Listener" />
                <add name="Database Trace Listener" />
            </listeners>
        </add>
    </categorySources>
    ...
</loggingConfiguration>
            <listeners>
                <add name="Database Trace Listener" />
                <add name="Email Trace Listener" />
            </listeners>

...
我们的问题是,如果电子邮件跟踪侦听器由于某种原因无法工作(例如SMTP服务器关闭),那么数据库跟踪侦听器也无法工作。

有没有办法配置DB Trace Listener,使其即使在电子邮件跟踪失败的情况下也能正常工作?

看来我已经设法解决了这个问题,我必须颠倒侦听器的顺序,如下所示:

<loggingConfiguration name="Logging Application Block" tracingEnabled="true" defaultCategory="MyProject" logWarningsWhenNoCategoriesMatch="true">
    <listeners>
        <add name="Database Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging.Database" ... />
        <add name="Email Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EmailTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ... />
    </listeners>
    <categorySources>
        <add switchValue="All" name="MyProject">
            <listeners>
                <add name="Email Trace Listener" />
                <add name="Database Trace Listener" />
            </listeners>
        </add>
    </categorySources>
    ...
</loggingConfiguration>
            <listeners>
                <add name="Database Trace Listener" />
                <add name="Email Trace Listener" />
            </listeners>

我可以看到这种行为的一些基本原理,但是我仍然不理解为什么在第一种情况下至少DB侦听器不工作。

如果一个源配置了多个跟踪侦听器,则当任何跟踪侦听器中发生错误时,处理将停止。i、 e.故障后配置的任何跟踪侦听器都不会执行(对于该源)。我不喜欢这种方法,因为我更喜欢独立处理所有侦听器。