如何有条件地抑制写入事件日志的应用程序异常?

时间:2008-10-29 21:40:19

标签: c# exception windows-services event-log

我正在开发一个Windows服务,每15秒轮询一次与网络设备的连接。如果该服务无法连接到设备,则会抛出异常并在15秒后再次尝试。所有这些都很有效。

但是,让我们说其中一个设备停机一天或更长时间。我每隔15秒填充异常日志,同样的异常。如果抛出的异常在最后x个小时内没有改变,是否有一种标准方法可以防止将异常写入事件日志?

5 个答案:

答案 0 :(得分:3)

实现所需要的一个好方法是采用断路器设计模式。

我首先在Michael T. Nygard的着作“发布它!设计和部署生产就绪软件”一书中读到这一点,来自实用新闻,p104-107。

断路器的想法是它位于系统之间连接的路径中,通过连接,观察“断开状态”。例如,只有当一行中的五个连接全部失败时,它才可能触发。

一旦电路断开,所有通过断路器的呼叫都会立即失败,而无需咨询外部服务。这种情况一直持续到超时发生,此时断路器进入半开状态。尝试下一次调用 - 失败导致超时被重置,断路器关闭成功以及系统恢复操作。

快速谷歌发现a post by Tim Ross读得很好,并详细介绍。

在您的情况下,您可以使用超时为10分钟的断路器,并触发5次故障。然后,在全天发生故障的情况下,您的日志文件将包含针对原始问题记录的五个异常,然后每小时再记录六个异常(与间隔15秒的240相比),表明问题仍然存在。

根据您的要求,您可以包括手动“重置”断路器,或者您可以让它在10分钟超时显示事情恢复正常时自动重置。这可能很有用 - 一般来说,系统管理员需要的事情就越少,他们就越喜欢它。

答案 1 :(得分:1)

可能有一个工作流程,如果轮询失败了一定次数,则轮询间隔会增加。例如如果失败则每15秒轮询一次,如果失败则将轮询间隔增加到1分钟,如果失败n次,则将时间增加到1小时。

说实话,上面的工作流程并没有真正解决您的问题。如果我是你,我会改变工作流程。而不是服务器轮询设备,为什么不反过来呢?当设备连接到联网计算机时,客户端服务会向服务器发送消息,以便服务器知道设备已连接并处于活动状态。

希望这会有所帮助......

RWendi

答案 2 :(得分:1)

如果您在应用程序中使用异常处理块,我假设您这样做,您可以在不同的异常处理策略之间切换。 首先是将异常信息写入事件日志的策略,然后在n次尝试或时间段之后,您可以切换到不记录到事件日志的策略。

增加连接尝试之间的持续时间可能会解决您的问题。 例如。 newTimeout = n * atomicTimeout其中n是attemts number。

答案 3 :(得分:0)

怎么样......

 int count = 0;
 while (true)
 {
      try
      {
           AttemptStuff()
      }
      catch (Exception ex)
      {
           if(count < 10)
           {
                EventLog.WriteEntry("my service", ex.ToString(), EventLogEntryType.Error);
                count++;
           }
      }
 }

答案 4 :(得分:0)

断路器模式是个好主意,比如说

查看一些PHP实现的设计,但可以应用于任何语言

http://artur.ejsmont.org/blog/PHP-Circuit-Breaker-initial-Zend-Framework-proposal