如何有条件地抑制写入事件日志的应用程序异常
本文关键字:日志 入事件 应用程序 异常 有条件 | 更新日期: 2023-09-27 17:47:46
我正在开发一项windows服务,该服务每15秒轮询一次与启用网络的设备的连接。如果服务无法连接到设备,它会抛出异常,并在15秒内重试。所有这些都很棒。
但是,假设其中一台设备停机一天或更长时间。我每隔15秒就会用相同的异常填充我的异常日志。如果抛出的异常在过去x小时内没有更改,是否有标准方法可以防止异常写入事件日志?
实现所需功能的一个好方法是采用断路器设计模式。
我第一次读到这一点是在Michael T.Nygard的《Release It!Design and Deploy Production Ready Software》一书中,该书来自Pragmatic Press,p104-107。
断路器的想法是,它位于系统之间连接的路径上,通过连接,观察"断开状态"。例如,只有当一行中的五个连接全部失败时,它才可能触发。
一旦电路断开,所有通过断路器的呼叫都会立即失败,而无需咨询外部服务。这种情况一直持续到发生超时,此时断路器进入半开状态。尝试下一次调用-失败将导致超时重置,断路器成功闭合,系统恢复运行。
在谷歌上快速搜索到蒂姆·罗斯的一篇帖子,这篇帖子读起来很好,而且更详细。
在你的情况下,你可以使用一个超时10分钟的断路器,触发5次故障。在全天故障的情况下,您的日志文件将包含针对原始问题记录的五个异常,然后每小时只记录六个(而每隔15秒记录240个),这表明问题仍然存在。
根据您的要求,您可以手动"重置"断路器,也可以在10分钟的超时显示情况恢复正常时让它自动重置。这可能很有用-一般来说,系统管理员需要处理的事情越少,他们就越喜欢它
可能有一个工作流,如果轮询失败一定次数,则会增加轮询间隔。例如,每15秒轮询3次,如果失败,则将轮询间隔增加到一分钟,如果失败n次,则将时间增加到一小时。
老实说,上面的工作流程并不能真正解决你的问题。如果我是你,我会颠倒工作流程。与其让服务器轮询设备,为什么不反过来呢?当设备连接到联网机器时,客户端服务会向服务器发送一条消息,以便服务器知道该设备已连接并处于活动状态。
希望这能帮助。。。
RWendi
如果您在应用程序中使用异常处理块,我想您确实使用了,那么您可以在不同的异常处理策略之间切换。首先是将异常信息写入事件日志的策略,然后在n次尝试或一段时间后,您可以切换到不记录到事件日志的政策。
增加连接尝试之间的持续时间可能会解决您的问题。例如,newTimeout=n*atomicTimeout,其中n是尝试次数。
那。。。
int count = 0;
while (true)
{
try
{
AttemptStuff()
}
catch (Exception ex)
{
if(count < 10)
{
EventLog.WriteEntry("my service", ex.ToString(), EventLogEntryType.Error);
count++;
}
}
}
比如,断路器模式是个好主意
查看一些PHP实现的设计,但可以应用于任何语言
http://artur.ejsmont.org/blog/PHP-Circuit-Breaker-initial-Zend-Framework-proposal