代码之家  ›  专栏  ›  技术社区  ›  JasonS

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

  •  2
  • JasonS  · 技术社区  · 16 年前

    我正在使用Windows服务,该服务每15秒轮询一次与启用网络的设备的连接。如果服务无法连接到设备,它将抛出异常并在15秒内重试。所有这些都很有效。

    但是,假设其中一个设备停机一天或更长时间。我每隔15秒就用相同的异常来填充我的异常日志。如果在最近x个小时内引发的异常没有发生变化,是否有标准的方法来防止异常被写入事件日志?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Bevan    16 年前

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

    我在《释放它》一书中第一次读到这个。设计和部署生产就绪软件”,作者:Michael T.Nygard,实用出版社,第104-107页。

    断路器的概念是,它位于系统之间连接的路径上,通过连接,观察“断开状态”。例如,只有当一行中的五个连接都失败时,它才会触发。

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

    找到一个快速的谷歌 a post by Tim Ross 它读起来很好,而且更详细。

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

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

        2
  •  1
  •   RWendi    16 年前

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

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

    希望这有帮助…

    雷文迪

        3
  •  1
  •   Raul    16 年前

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

    增加连接尝试之间的持续时间可能会解决您的问题。 例如newtimeout=n*atomictimeout,其中n是attmts数。

        4
  •  0
  •   Matt Jacobsen    16 年前

    那……怎么样?

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

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

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

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